【python】dataframe重复索引修改

该代码示例展示了如何使用Python的Pandas库处理具有重复索引的数据表。通过重置索引,找出重复项,为每个重复的索引值添加唯一后缀(如1,2,3等),然后设置新索引并检查是否仍有重复,确保数据的唯一性。
摘要由CSDN通过智能技术生成

需求说明

比如有如下数据表,其中index有重复,且重复的次数不等。需求是:将相同的index进行批量修改,修改为不同的index。
在这里插入图片描述
比如,给每个相同的idnex加一个后缀(1,2,3,…):
在这里插入图片描述

代码实现

python3

# python3
import pandas as pd

def modify_duplicates(df):
    indexname = df.index.name
    
    # 创建新的索引列
    df.reset_index(inplace=True)
    
    # 获取重复索引的位置
    duplicated_index = df.duplicated(subset=indexname, keep=False)
    duplicated_positions = df[duplicated_index].index
    
    # 批量处理相同索引
    for pos in duplicated_positions:
        index_value = df.at[pos, indexname]
        
        # 索引为“index_value”的重复的次数
        n_dup = len(df[df[indexname]==index_value])
        # print("index_value", index_value, n_dup)
        
        # 发现一个重复索引处理后,(下面)会同时对所有索引进行处理。如果重复次数不是>=2,则不再处理
        if n_dup < 2: 
            continue
            
        # 对索引为“index_value”的n_dup个索引统一修改(上面判断n_dup<2,则不再处理)
        new_index_values = [f"{index_value}{i+1}" for i in range(n_dup)]
        df.loc[df[indexname]==index_value, indexname] = new_index_values
    
    # 将修改后的列重新设为索引
    df.set_index(indexname, inplace=True)
    
    # 检查修改后的是否有重复,如果有,请修改“new_index_values”中的命名定义
    re_df = df.reset_index(inplace=False)
    re_duplicated_index = re_df.duplicated(subset=indexname, keep=False)
    re_duplicated_positions = re_df[re_duplicated_index].index
    if list(re_duplicated_positions):
        print("#NOTE**: There are still duplicates after the modified, "
              "please change definition of `new_index_values`!!!")
    else:
        print("#NOTE: After modified, without duplicates in index.")

    return df


# 创建示例 DataFrame
data = {'A': [1, 2, 3, 4, 5], 'B': [5, 6, 7, 8, 9]}
# df = pd.DataFrame(data, index=['a1', 'a1', 'a1', 'a2', 'a2'])
df = pd.DataFrame(data, index=['a1', 'a11', 'a12', 'a21', 'a22'])
df.index.name = 'index_column'

# 打印修改前的 DataFrame
print("修改前的 DataFrame:")
display(df)

# 调用函数进行修改
df_modified = modify_duplicates(df)

# 打印修改后的 DataFrame
print("修改后的 DataFrame:")
display(df_modified)

执行代码得到:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值