如何基于多分组列实现数据聚合与自定义列重命名?
解决pandas聚合后按规则重命名列的问题
针对你的需求,这里提供一种直接实现的方法,能处理多设备、多腔室的场景:
步骤说明
- 按
sheet、equipment、chamber分组,对value1和value2执行mean/min/max聚合; - 将聚合后的列名与分组的设备、腔室名称拼接,生成符合「设备名称+腔室名称+字段名+聚合函数」规则的新列名;
- 合并同一
sheet下不同设备腔室的聚合结果,最终每个sheet对应一行数据。
代码示例
import pandas as pd # 构造示例数据(实际使用时替换为你的数据读取逻辑) data = { 'sheet': ['a', 'a', 'a', 'b', 'b', 'b'], 'equipment': ['E1', 'E1', 'E1', 'E1', 'E1', 'E1'], 'chamber': ['C1', 'C1', 'C1', 'C1', 'C1', 'C1'], 'time': [1, 2, 3, 1, 2, 3], 'value1': [11, 12, 13, 14, 15, 16], 'value2': [21, 22, 23, 24, 25, 26] } df = pd.DataFrame(data) # 1. 分组聚合,先指定基础聚合列名 agg_result = df.groupby(['sheet', 'equipment', 'chamber']).agg( value1_mean=('value1', 'mean'), value1_min=('value1', 'min'), value1_max=('value1', 'max'), value2_mean=('value2', 'mean'), value2_min=('value2', 'min'), value2_max=('value2', 'max') ).reset_index() # 2. 构造最终结果DataFrame final_df = pd.DataFrame() for _, row in agg_result.iterrows(): sheet_val = row['sheet'] eq_val = row['equipment'] ch_val = row['chamber'] # 拼接新列名与对应值 row_data = {'sheet': sheet_val} for col in agg_result.columns: if col not in ['sheet', 'equipment', 'chamber']: field, agg_func = col.split('_') new_col_name = f"{eq_val}_{ch_val}_{field}_{agg_func}" row_data[new_col_name] = row[col] final_df = pd.concat([final_df, pd.DataFrame([row_data])], ignore_index=True) # 3. 合并同一sheet的多设备腔室数据(若有) final_df = final_df.groupby('sheet').first().reset_index() # 输出结果 print(final_df)
输出结果
运行后会得到你需要的格式:
| sheet | E1_C1_value1_mean | E1_C1_value1_min | E1_C1_value1_max | E1_C1_value2_mean | E1_C1_value2_min | E1_C1_value2_max |
|---|---|---|---|---|---|---|
| a | 12.0 | 11.0 | 13.0 | 22.0 | 21.0 | 23.0 |
| b | 15.0 | 14.0 | 16.0 | 25.0 | 24.0 | 26.0 |
如果你的数据中有多个设备(如E2)或腔室(如C2),这段代码会自动将它们的聚合结果作为新列添加到对应sheet的行中,无需修改逻辑。
内容的提问来源于stack exchange,提问作者TingWei Chen
相关产品推荐
相关产品推荐

