如何将多列传入聚合函数,重塑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,提问作者Бодя павук
相关产品推荐
相关产品推荐

