【python】dataframe重复索引修改

需求说明

比如有如下数据表,其中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)

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

猜你喜欢

转载自blog.csdn.net/sinat_32872729/article/details/131675844