首页 > 解决方案 > 如何使列重复值唯一?

问题描述

东风:

 colA   ColB   ColC
0  A      B      345
1  B      C      876
2  D      B      983
3  A      B      371
4  G      B      972
5  H      K      193
6  G      B      367
7  D      J      293


   colA  ColB   ColC
0  A_A    B      345
1  B      C      876
2  D      B      983
3  A_B    B      371
4  G_A    B      972
5  H      K      193
6  G_B    B      367
7  D      J      293

如果列值重复,如何使列值唯一,例如,如果您看到我正在检查 ColA 和 ColB,如果找到任何重复对并且我将 _A 附加到 ColA 中的第一个和 _B 到第二个。如果有 3 对重复,那么它将 _C 附加到第三对。

标签: pythonpandas

解决方案


如果有最大的26重复值,如字母 create dictionary by enumeratewith string.ascii_uppercase,则仅选择重复的行 byDataFrame.duplicated并添加由 counter 和创建的新GroupBy.cumcountSeries.map

import string

d = dict(enumerate(string.ascii_uppercase))

print (len(d))
26

m = df.duplicated(['colA', 'ColB'], keep=False)
df.loc[m, 'colA'] += '_' + df[m].groupby(['colA', 'ColB']).cumcount().map(d)
print (df)
  colA ColB  ColC
0  A_A    B   345
1    B    C   876
2    D    B   983
3  A_B    B   371
4  G_A    B   972
5    H    K   193
6  G_B    B   367
7    D    J   293

如果可能的话,添加数字而不是字母是可能的解决方案简化:

m = df.duplicated(['colA', 'ColB'], keep=False)
df.loc[m, 'colA'] += '_' + df[m].groupby(['colA', 'ColB']).cumcount().astype(str)
print (df)
  colA ColB  ColC
0  A_0    B   345
1    B    C   876
2    D    B   983
3  A_1    B   371
4  G_0    B   972
5    H    K   193
6  G_1    B   367
7    D    J   293

推荐阅读