首页 > 解决方案 > Pandas - 用增加的后缀标记列表中的重复元素

问题描述

鉴于以下情况:

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值是重复的,但它们是不同的东西。

标签: pythonpandasduplicatesdata-manipulation

解决方案


我们可以分两步来做,第一步groupbycumcount然后mask

s='_'+df_from.groupby('col1').cumcount().add(1).astype(str)
df_from.col1+=s.mask(s=='_1','')
df_from
Out[290]: 
  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

推荐阅读