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

Pandas按CLASS拆分DataFrame、长宽转换后如何遍历子表执行函数

问题核心原因

你代码的问题有两处:

  1. 循环体内调用pivot_table时用的是原始全量df,而非每个分组对应的子DataFrame,导致每次生成的都是全量数据的透视结果,自然没有CLASS区分
  2. 循环变量名定义反了:d.items()返回的是(分组键, 分组子表)的元组,你写的for names, classes in d.items()里,names实际是CLASS的取值,classes才是对应子表,命名混淆容易引发逻辑错误
修复方案

方案1:基于你现有分组字典调整

# 定义字典存储每个CLASS对应的透视后结果,方便后续调用
pivot_result = {}

for class_val, sub_df in d.items():
    # 对当前分组的子表做透视,而非全量df
    newdata = sub_df.pivot_table(index="TIME", columns="NAME", values="GRADE")
    # 可选操作:将CLASS作为新列存入透视表,方便后续识别
    newdata['CLASS'] = class_val
    # 存入结果字典,key为CLASS取值,value为对应透视子表
    pivot_result[class_val] = newdata
    # 此处可直接执行你的自定义函数,例如:
    # your_custom_func(newdata)

执行后结果示例:

  • pivot_result['A']输出:
NAME  a  b CLASS
TIME            
1     4  4     A
2     5  5     A
  • pivot_result['B']输出:
NAME  c  d CLASS
TIME            
1     4  4     B
2     5  5     B

方案2:更简洁的直接遍历groupby对象

无需提前将groupby对象转为字典,可直接迭代处理:

pivot_result = {}
for class_val, sub_df in df.groupby('CLASS'):
    newdata = sub_df.pivot_table(index="TIME", columns="NAME", values="GRADE")
    newdata['CLASS'] = class_val
    pivot_result[class_val] = newdata
    # 直接调用自定义函数
    # your_custom_func(newdata)
后续遍历执行自定义函数方法

如果需要后续再批量处理所有子表,直接遍历结果字典即可:

for class_val, pivot_df in pivot_result.items():
    # class_val为当前子表对应的CLASS取值,pivot_df为对应透视子表
    # 此处写入你的自定义逻辑即可
    print(f"当前处理CLASS:{class_val}")
    print(pivot_df)

内容的提问来源于stack exchange,提问作者Michael J. Erickson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:24:04