Pandas使用groupby对同列计算均值、最值并按分组拼接列名的实现方法
实现代码
你可以通过pandas的分组聚合+多层索引合并功能直接实现需求,完整代码如下:
import pandas as pd # 你的样例DataFrame df = pd.DataFrame( { "type": [ "cc", "cc", "cc", "cc", "cc", "cc", "pp", "pp", "pp", "pp", "pp", "pp", ], "label": [ "[0,50)", "[0,50)", "[0,50)", "[50,100)", "[50,100)", "[50,100)", "[0,50)", "[0,50)", "[0,50)", "[50,100)", "[50,100)", "[50,100)", ], "margin": [ 10, 11, 12, 20, 25, 30, 17, 18, 19, 40, 45, 50, ], } ) # 核心计算逻辑 # 1. 按type、label分组,计算margin的三个统计值 grouped_df = df.groupby(['type', 'label'])['margin'].agg(['mean', 'min', 'max']) # 2. 将type维度转到列层级 grouped_df = grouped_df.unstack(level=0) # 3. 合并多层列名为[type]_[统计量]格式 grouped_df.columns = [f'{col[1]}_{col[0]}' for col in grouped_df.columns] # 4. 重置索引,将label转为普通列 result = grouped_df.reset_index() print(result)
输出结果说明
运行代码后得到的result完全符合要求,结构如下:
| 序号 | label | cc_mean | cc_min | cc_max | pp_mean | pp_min | pp_max |
|---|---|---|---|---|---|---|---|
| 0 | [0,50) | 11 | 10 | 12 | 18 | 17 | 19 |
| 1 | [50,100) | 25 | 20 | 30 | 45 | 40 | 50 |
内容的提问来源于stack exchange,提问作者Vega
相关产品推荐
相关产品推荐

