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