基于Col2值重命名Pandas DataFrame中Col1重复项的实现问题
解决Pandas重复值分组重命名问题
问题分析
你需要对Col1中存在重复值的分组,按Col2升序排序后给Col1添加.A、.B这类后缀(最小的Col2对应.A),非重复值保持原样。之前用lambda结合shift()报错,是因为在lambda里直接比较整个Series,Pandas无法判断布尔Series的真值,导致ValueError,这种场景应该用分组处理来实现。
实现步骤
- 先按
Col1和Col2排序,确保每组内的行按Col2从小到大排列 - 对
Col1分组后,用cumcount()生成组内的顺序编号(从0开始) - 将编号转换为对应的字母(0→A,1→B...),再和原
Col1拼接 - 对只有单个元素的分组,保留原
Col1值不修改
完整代码
import pandas as pd df = pd.DataFrame({"Col1": ["AA", "AB", "AA", "CC", "FF"], "Col2": [18, 23, 13, 33, 48], "Col3": [17, 27, 22, 37, 52]}) # 1. 按Col1分组,Col2升序排序 sorted_df = df.sort_values(['Col1', 'Col2']) # 2. 生成组内顺序编号,转换为A/B后缀 sorted_df['suffix'] = sorted_df.groupby('Col1').cumcount().apply(lambda x: chr(ord('A') + x)) # 3. 拼接Col1和后缀,单元素组保留原值 sorted_df['Col1'] = sorted_df.apply( lambda row: f"{row['Col1']}.{row['suffix']}" if sorted_df[sorted_df['Col1'] == row['Col1']].shape[0] > 1 else row['Col1'], axis=1 ) # 4. 可选:恢复原索引顺序(如果需要),不需要的话直接取sorted_df即可 result = sorted_df.loc[df.index].reset_index(drop=True) print(result)
输出结果
Col1 Col2 Col3 0 AA.B 18 17 1 AB 23 27 2 AA.A 13 22 3 CC 33 37 4 FF 48 52
关键说明
groupby('Col1').cumcount():在每个Col1分组内,按排序后的顺序生成从0开始的连续编号,刚好对应.A、.B的顺序chr(ord('A') + x):把数字编号转成大写字母,x=0得到'A',x=1得到'B',以此类推- 最后用
loc[df.index]可以恢复原DataFrame的行顺序,如果不需要保留原顺序,直接使用sorted_df即可
内容的提问来源于stack exchange,提问作者AZhu
相关产品推荐
相关产品推荐

