鉴于以下情况:
from io import StringIO
csv = """\
col1,col2,col3
a,x,0.556281869
b,y,0.24783546399999998
c,z,0.010661738999999998
d,r,0.7982442009999999
a,p,0.642690298
f,q,0.734872757
c,t,0.432764343
a,g,0.37042963
"""
df_from = pd.read_csv(StringIO(csv))
csv = """\
col1,col2,col3
a,x,0.42584888
b,y,0.938256412
c,z,0.339138513
d,r,0.16887348600000002
a_2,p,0.18562532199999998
f,q,0.289833661
c,t,0.108988277
a_3,g,0.861110437
"""
df_to = pd.read_csv(StringIO(csv))
看起来像
# df_from
col1 col2 col3
0 a x 0.556282
1 b y 0.247835
2 c z 0.010662
3 d r 0.798244
4 a p 0.642690
5 f q 0.734873
6 c t 0.432764
7 a g 0.370430
# df_to
col1 col2 col3
0 a x 0.425849
1 b y 0.938256
2 c z 0.339139
3 d r 0.168873
4 a_2 p 0.185625
5 f q 0.289834
6 c t 0.108988
7 a_3 g 0.861110
我希望能够df_to
基于进行创建df_from
,我知道duplicated()
,但我不知道如何以一种会根据需要添加后缀的方式应用它,因为尽管这些a
值都是重复的,但它们是不同的东西。
使用GroupBy.cumcount
计数器,加1
因为默认情况下是计数0
,转换为字符串,前置_
和最后删除_1
的值(第一值):
s = df_from.groupby('col1').cumcount().add(1).astype(str)
df_from['col1'] += ('_' + s).replace('_1', '')
print (df_from)
col1 col2 col3
0 a x 0.556282
1 b y 0.247835
2 c z 0.010662
3 d r 0.798244
4 a_2 p 0.642690
5 f q 0.734873
6 c_2 t 0.432764
7 a_3 g 0.370430
或者,如果只想为Series.duplicated
使用类似解决方案创建的重复值添加新值:
mask = df_from['col1'].duplicated()
s1 = '_' + df_from[mask].groupby('col1').cumcount().add(2).astype(str)
df_from.loc[mask, 'col1'] += s1
print (df_from)
col1 col2 col3
0 a x 0.556282
1 b y 0.247835
2 c z 0.010662
3 d r 0.798244
4 a_2 p 0.642690
5 f q 0.734873
6 c_2 t 0.432764
7 a_3 g 0.370430
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句