我正在使用熊猫版本0.23.0。我想按功能使用数据帧分组,以使用λ函数生成新的聚合列。
我的数据框看起来像
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()
,但是会创建一个新的新数据框。这意味着我将对所有列都必须这样做,并将它们合并到一个新的数据框中。 有更简单的方法可以做到这一点吗?
答案 0 :(得分:1)
按字典功能使用具有聚合功能的列名使用DataFrameGroupBy.agg
,然后按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 bellow
#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