python - python pandas分组和聚合列
问题描述
我正在使用熊猫版本 0.23.0。我想按函数使用数据框组来使用 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
这里:
- Flag0_Count 是 Flag = 0 的计数
- Flag1_Count 是 Flag = 1 的计数
- Flag0_Amount_SUM 是 Flag = 0 时金额的 SUNM
- Flag1_Amount_SUM 是 Flag = 1 时金额的 SUNM
- Flag0_User_Count 是 Flag = 0 时不同用户的计数
- Flag1_User_Count 是 Flag = 1 时不同用户的计数
我尝试过类似的东西
df.groupby(["ID"])["Flag"].apply(lambda x: sum(x==0)).reset_index()
但它会创建一个新的新数据框。这意味着我必须对所有列进行此操作,并将它们合并到一个新的数据框中。有没有更简单的方法来实现这一点?
解决方案
通过带有聚合函数的列名按字典使用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
推荐阅读
- css - SVG 图像分三个部分着色
- java - 具有内部联接和多对多的 Hibernate Criteria Api
- apache-spark - 无法连接到工作节点上的 localhost
- c++ - 处理文件和目录时 WinAPI 中的问题
- ios - 如何遍历数组以初始化按钮?
- ios - 如何使用金属获得准确的帧速率?
- visual-studio-code - 如何创建 VS Code 的任务来执行当前文件,并将其文件夹设置为当前工作目录?
- java - 编写扩展 ArrayList 的类的构造函数
- glut - GlutKeyboardFunc 回调在 openGL 中不起作用
- ruby-on-rails - 无法启动 Rails 项目地址与请求的协议不兼容