Pandas按CLASS拆分DataFrame、长宽转换后如何遍历子表执行函数
问题核心原因
你代码的问题有两处:
- 循环体内调用
pivot_table时用的是原始全量df,而非每个分组对应的子DataFrame,导致每次生成的都是全量数据的透视结果,自然没有CLASS区分 - 循环变量名定义反了:
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
相关产品推荐
相关产品推荐

