You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多列传入聚合函数,重塑Pandas DataFrame为指定结构?

问题:将2D DataFrame重塑为多层列结构

需求说明

  • 现有规模庞大但结构简单的2D DataFrame,需重塑为指定多层列结构(仅匹配结构即可,数据处理与过滤已完成,索引取自time_spend_company列)
  • 涉及列:last_evaluation、satisfaction_level、left(left取值0或1,分别代表员工在职/离职)

目标结构示例

max                                           mean        
  last_evaluation       satisfaction_level       last_evaluation
                0     1                  0     1               0     1
2             1.0  0.99                1.0  0.94            0.72  0.69
7             1.0  0.90                1.0  0.94            0.77  0.75

                                       min
  satisfaction_level       last_evaluation       satisfaction_level
                   0     1               0     1                  0     1
2               0.70  0.65            0.37  0.52               0.09  0.29
7               0.48  0.60            0.36  0.42               0.09  0.15 

转换为字典后的结构:

{('max', 'last_evaluation', 0): {2: 1.0, 7: 1.0},
 ('max', 'last_evaluation', 1): {2: 0.99, 7: 0.9},
 ('max', 'satisfaction_level', 0): {2: 1.0, 7: 1.0},
 ('max', 'satisfaction_level', 1): {2: 0.94, 7: 0.94},
 ('mean', 'last_evaluation', 0): {2: 0.72, 7: 0.77},
 ('mean', 'last_evaluation', 1): {2: 0.69, 7: 0.75},
 ('mean', 'satisfaction_level', 0): {2: 0.7, 7: 0.48},
 ('mean', 'satisfaction_level', 1): {2: 0.65, 7: 0.6},
 ('min', 'last_evaluation', 0): {2: 0.37, 7: 0.36},
 ('min', 'last_evaluation', 1): {2: 0.52, 7: 0.42},
 ('min', 'satisfaction_level', 0): {2: 0.09, 7: 0.09},
 ('min', 'satisfaction_level', 1): {2: 0.29, 7: 0.15}}

尝试的代码及报错

尝试用以下代码实现:

reformated_df = df.groupby("time_spend_company")\
    .agg(min=(("satisfaction_level", "last_eval"), max_last_eval_and_satis_level))

出现错误:

KeyError: "Column(s) [array(['last_eval', 'satisfaction_level'], dtype=object)] do not exist"

解决方案

方法一:分组聚合后重塑列

先按time_spend_company和left分组计算统计量,再调整列层级结构:

import pandas as pd

# 1. 分组计算min/mean/max
grouped = df.groupby(["time_spend_company", "left"])[["last_evaluation", "satisfaction_level"]].agg(["min", "mean", "max"])
# 2. 交换列的层级,把统计量放到最外层
grouped = grouped.swaplevel(0, 1, axis=1).sort_index(axis=1)
# 3. 将left从行索引移到列索引
result = grouped.unstack(level="left")
# 4. 调整列层级顺序以匹配目标结构(可选)
result = result.reorder_levels([0, 1, 2], axis=1).sort_index(axis=1)

方法二:使用pivot_table

直接用pivot_table指定索引、列、值和聚合函数,再调整列层级:

import pandas as pd

result = pd.pivot_table(
    df,
    index="time_spend_company",
    columns=["left"],
    values=["last_evaluation", "satisfaction_level"],
    aggfunc=["min", "mean", "max"]
)
# 调整列层级顺序以匹配目标结构
result = result.swaplevel(0, 1, axis=1).sort_index(axis=1)

说明:两种方法都能生成目标多层列结构,swaplevel和sort_index用于对齐列的层级顺序(统计量min/mean/max在外层,然后是指标列,最后是left的0/1取值)。

内容的提问来源于stack exchange,提问作者Бодя павук

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:25:47