【问题标题】:Pandas - mark duplicate elements in a list with an increasing suffixPandas - 用增加的后缀标记列表中的重复元素
【发布时间】:2020-07-21 13:45:01
【问题描述】:

鉴于以下情况:

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_from 创建df_to,我知道duplicated(),但我不知道如何以将后缀添加为的方式应用它需要,因为尽管这些 a 值是重复的,但它们是不同的东西。

【问题讨论】:

    标签: python pandas duplicates data-manipulation


    【解决方案1】:

    使用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
    

    【讨论】:

      【解决方案2】:

      我们可以通过两步来完成,第一步是 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 2015-12-13
        • 2021-03-30
        • 2012-10-03
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多