如何为DataFrame重复项添加标记并解决输出顺序混乱问题
为DataFrame重复项添加索引编号的问题修正
问题描述
原始DataFrame:
Column_A 0 Kitten 1 Kitten 2 Judy 3 Lamb 4 Momo 5 Judy
期望生成包含索引编号的新列Column_B,结果如下(保留原始行顺序):
Column_B Column_A 0 Kitten_1 Kitten 1 Kitten_2 Kitten 2 Judy_1 Judy 3 Lamb_1 Lamb 4 Momo_1 Momo 5 Judy_2 Judy
注:你提供的期望结果中Momo _2应为笔误,修正为Momo_1。
原代码及错误结果
原代码:
import pandas as pd # My dataframe data = {'Column_A':['Kitten','Kitten','Judy','Lamb','Momo','Judy']} df = pd.DataFrame(data) df = df.sort_values("Column_A", axis = 0, ascending = False) df_list = df['Column_A'].tolist() df_list.sort() new_df_list = list(set(df_list)) new_list = [] for k in new_df_list: ori_list = df[df["Column_A"] == k ]['Column_A'].tolist() number = len(ori_list) for n in range(number): new_list.append(k+'_'+str(n+1)) print(k+'_'+str(n+1)) print(len(new_list)) new_list.sort(reverse=True) new_DF=pd.DataFrame(new_list, columns = ['Column_B']) final_df = pd.concat([new_DF,df],axis=1) print(final_df)
运行后输出顺序混乱,结果:
Column_B Column_A 0 Momo_1 Kitten 1 Lamb_1 Kitten 2 Kitten_2 Judy 3 Kitten_1 Lamb 4 Judy_2 Momo 5 Judy_1 Judy
问题原因
- 多次调用排序方法(
sort_values、df_list.sort、new_list.sort(reverse=True))彻底打乱了原始行的顺序 - 使用
set去重会丢失原始数据的顺序,导致生成的Column_B无法和原Column_A正确对应
修正方案
利用Pandas内置的groupby+cumcount方法,无需手动循环和排序,直接保留原始顺序并生成索引编号:
import pandas as pd # 创建原始DataFrame data = {'Column_A':['Kitten','Kitten','Judy','Lamb','Momo','Judy']} df = pd.DataFrame(data) # 为每组重复项生成递增编号,并拼接成Column_B df['Column_B'] = df['Column_A'] + '_' + (df.groupby('Column_A').cumcount() + 1).astype(str) # 输出结果 print(df)
运行结果:
Column_A Column_B 0 Kitten Kitten_1 1 Kitten Kitten_2 2 Judy Judy_1 3 Lamb Lamb_1 4 Momo Momo_1 5 Judy Judy_2
代码说明
df.groupby('Column_A').cumcount():按Column_A分组后,为每组内的行分配从0开始的序号+1:将序号转为从1开始的计数astype(str):将数字转为字符串,方便和Column_A的内容拼接
内容的提问来源于stack exchange,提问作者CanaryTheBird
相关产品推荐
相关产品推荐

