Pandas分组聚合:如何将Registered分组转为列而非行?
问题:将分组聚合结果按注册状态转为列展示
我有一份数据集,每周每条记录对应一个用户,包含该用户是否注册(Registered)以及相关指标值(Metric Value):
cols = ["Worker ID", "Registered", "Week Ending", "Metric Value"] rows = [ ['A', True, '2022-08-06', 2], ['B', False, '2022-08-06', 3], ['C', False, '2022-08-06', 4], ['A', True, '2022-08-13', 3], ['B', False, '2022-08-13', 2], ['C', True, '2022-08-13', 5] ] df = pd.DataFrame(columns=cols, data = rows)
常规按Week Ending和Registered分组聚合的写法如下:
df.groupby(["Week Ending", "Registered"]).agg({'Worker ID': pd.Series.nunique, "Metric Value": sum})
但该写法会将分组结果以行形式呈现,我希望将Registered的分组转为列形式,得到如下格式的结果:
| 周末日期 | 已注册Worker ID数量 | 未注册Worker ID数量 | 已注册指标值总和 | 未注册指标值总和 |
|---|---|---|---|---|
| 2022-08-06 | 1 | 2 | 2 | 7 |
| 2022-08-13 | 2 | 1 | 8 | 2 |
请问如何实现这一需求?
解决方案
可以通过两种方式实现需求,以下是具体代码:
方法1:使用pivot_table一步完成
直接通过透视表指定行、列、聚合字段和规则,再调整列名:
import pandas as pd # 生成透视表 result = pd.pivot_table( df, index='Week Ending', columns='Registered', values=['Worker ID', 'Metric Value'], aggfunc={'Worker ID': pd.Series.nunique, 'Metric Value': sum} ) # 重命名列名并重置索引 result.columns = [ '已注册Worker ID数量' if col == (True, 'Worker ID') else '未注册Worker ID数量' if col == (False, 'Worker ID') else '已注册指标值总和' if col == (True, 'Metric Value') else '未注册指标值总和' for col in result.columns ] result = result.reset_index().rename(columns={'Week Ending': '周末日期'})
方法2:分组聚合后unstack转换列
先完成分组聚合,再将Registered层级转为列,最后调整列名:
import pandas as pd # 先执行分组聚合 agg_df = df.groupby(["Week Ending", "Registered"]).agg( worker_count=('Worker ID', pd.Series.nunique), metric_sum=('Metric Value', sum) ) # 将Registered层级转为列 unstacked = agg_df.unstack('Registered') # 合并列层级并修改为目标名称 unstacked.columns = [ f"{'已注册' if col[1] else '未注册'}{'Worker ID数量' if col[0] == 'worker_count' else '指标值总和'}" for col in unstacked.columns ] # 重置索引并重命名日期列 result = unstacked.reset_index().rename(columns={'Week Ending': '周末日期'})
两种方法最终都会输出你需要的表格格式。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

