获取熊猫python中每个类别/组的重复值计数

时间:2018-07-23 18:43:28

标签: python pandas dataframe pandas-groupby

我有一个像这样的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够了吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

IIUC,您可以使用此方法。将数据框过滤为重复项,然后使用nunique分组并求和,最后将两列分开。

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