python - 如何使列重复值唯一?
问题描述
东风:
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 附加到第三对。
解决方案
如果有最大的26
重复值,如字母 create dictionary by enumerate
with string.ascii_uppercase
,则仅选择重复的行 byDataFrame.duplicated
并添加由 counter 和创建的新GroupBy.cumcount
值Series.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
推荐阅读
- python - 如何减少二维连接域上的集成的集成时间
- google-apps-script - 如何让这个脚本运行得更快?
- javascript - 将两个重复添加到 javascript 中所有数字组合的生成列表中
- android - NotificationListenerService - 调用 stopService() 时服务不会停止
- grafana - 如何在 grafana 的状态面板中显示来自 influxdb 的两个测量值的总和
- r - R - 通过键对连接数据表
- wso2 - WSO2 3.1.0 APIM 实例。是否可以通过 deployment.toml 文件将 WSO2_CARBON_DB 数据源配置为 oracle 配置?
- windows - powershell脚本检查互联网连接然后做如果其他
- ruby-on-rails - Rails 查询相互连接的模型以命中方法
- microsoft-edge - MS Edge 是否支持 CSS 自定义属性