【问题标题】:Get count of duplicated values per category/group in pandas python获取pandas python中每个类别/组的重复值计数
【发布时间】:2018-07-23 18:43:28
【问题描述】:

我有一个这样的 df1:

Type     Name     Identifier     Number     Amount
 A        xx          0001         12        0.89
          xx          0001         56        0.78
          zz          0002         33        0.56
          yy          0020         44        0.45
          yy          0020         67        0.45
 B        ww          0300         12        0.34
          ww          0300         54        0.1
          kk          0900         43        0.2

我想获取每种类型的重复标识符的计数,以便生成的数据框现在看起来像

 Type     Count_Dups      Ave. Amount  
  A         2                2.345  
  B         1                0.44

大街在哪里。数量是所有重复值的总和/重复值的计数。 (例如:A = (0.89+0.78+0.45+0.45)/2)

我应该使用 for 循环吗? groupby 够用吗?

【问题讨论】:

  • 不清楚您所说的“重复标识符的计数”是什么意思,因为在您的示例中,重复的不同标识符的数量总是相同的,因为存在与前一行重复的行。例如。 [1, 2, 3, 3, 3] 的重复计数是 1 还是 2?
  • (0.89+0.78+0.45+0.45)/2 不是 2.345。
  • 你试过什么代码?
  • @DSM 我想获取每组重复值的计数。在 A 组中有 2 个重复项(0001 和 0002),而在 B 组中有 1 个重复的标识符(0300)。
  • @HarvIpan 我尝试使用 for 循环,但没有显示我想要的输出。

标签: python pandas dataframe pandas-groupby


【解决方案1】:

IIUC,你可以用这个方法。将数据框过滤到重复项,然后使用 nunique 和 sum 进行分组,最后将两列分开。

df_out = df1[df1.duplicated(subset=['Type','Identifier'], keep=False)]\
             .groupby('Type')['Identifier','Amount']\
             .agg({'Identifier':'nunique','Amount':'sum'})\
             .rename(columns={'Identifier':'Count_Dups'})

df_out['Ave. Amount'] = df_out['Amount']  / df_out['Count_Dups']

print(df_out.reset_index())

输出:

  Type  Count_Dups  Amount  Ave. Amount
0    A           2    2.57        1.285
1    B           1    0.44        0.440

【讨论】:

    【解决方案2】:

    要识别重复项,请按行的类型和标识符对行进行分组:

    dups = df.groupby(['Type', 'Identifier'])['Amount']\
             .agg(['size', 'sum']).reset_index()
    #  Type  Identifier  size   sum
    #0    A           1     2  1.67
    #1    A           2     1  0.56
    #2    A          20     2  0.90
    #3    B         300     2  0.44
    #4    B         900     1  0.20
    

    选择出现多次的行:

    dups = dups[dups['size'] > 1]
    

    计算他们的部分总和:

    dups_stats = dups.groupby('Type')['sum']\
                     .agg(['size','sum'])
    #      size   sum
    #Type            
    #A        2  2.57
    #B        1  0.44
    

    最后,将总和除以计数得到平均值:

    dups_stats['sum'] /= dups_stats['size']
    #      size    sum
    #Type             
    #A        2  1.285
    #B        1  0.440
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2015-06-01
      • 1970-01-01
      • 2018-07-26
      • 2016-11-13
      相关资源
      最近更新 更多