[英]python pandas group by and aggregate columns
我正在使用熊猫版本 0.23.0。 我想使用按 function 分组的数据框来使用 [lambda] 函数生成新的聚合列。
我的数据框看起来像
ID Flag Amount User
1 1 100 123345
1 1 55 123346
2 0 20 123346
2 0 30 123347
3 0 50 123348
我想生成一个看起来像的表
ID Flag0_Count Flag1_Count Flag0_Amount_SUM Flag1_Amount_SUM Flag0_User_Count Flag1_User_Count
1 2 2 0 155 0 2
2 2 0 50 0 2 0
3 1 0 50 0 1 0
这里:
我试过类似的东西
df.groupby(["ID"])["Flag"].apply(lambda x: sum(x==0)).reset_index()
但它创建了一个新的数据框。 这意味着我必须对所有列都这样做,并将它们合并到一个新的数据框中。 有没有更简单的方法来完成这个?
按列名称字典使用DataFrameGroupBy.agg
聚合 function,然后通过unstack
重塑,展平列的MultiIndex
, rename
列和最后一个reset_index
:
df = (df.groupby(["ID", "Flag"])
.agg({'Flag':'size', 'Amount':'sum', 'User':'nunique'})
.unstack(fill_value=0))
#python 3.6+
df.columns = [f'{i}{j}' for i, j in df.columns]
#python below
#df.columns = [f'{}{}'.format(i, j) for i, j in df.columns]
d = {'Flag0':'Flag0_Count',
'Flag1':'Flag1_Count',
'Amount0':'Flag0_Amount_SUM',
'Amount1':'Flag1_Amount_SUM',
'User0':'Flag0_User_Count',
'User1':'Flag1_User_Count',
}
df = df.rename(columns=d).reset_index()
print (df)
ID Flag0_Count Flag1_Count Flag0_Amount_SUM Flag1_Amount_SUM \
0 1 0 2 0 155
1 2 2 0 50 0
2 3 1 0 50 0
Flag0_User_Count Flag1_User_Count
0 0 2
1 2 0
2 1 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.