pandas.Resampler.agg传入函数字典报错Series无price属性问题求助
pandas Resampler 传函数字典跨列访问报错解决
根因说明
- 向
Resampler.apply或Resampler.agg接口传入{列名: 聚合函数}格式的字典时,pandas默认触发按列分发逻辑:每个指定列会被单独提取为Series对象,传入对应的自定义函数。依赖多列计算的函数(如vwap需要同时用price和qty列)仅能拿到单个列的Series,自然无法访问其他列属性。 - 仅传入单个聚合函数时,pandas会将完整的分组DataFrame作为入参传入函数,因此可以正常访问所有列。
- 官方示例可正常运行的原因是示例中用到的聚合函数均为单列可完成计算的逻辑(如求和、求均值),无需跨列访问数据,符合字典传参的设计语义。
解决方案
方案1:单聚合函数返回多列结果
定义统一的分组聚合函数,接收完整的分组DataFrame,返回包含所有聚合结果的Series即可,无需使用字典映射:
import pandas as pd def group_aggregate(group_df): return pd.Series({ "price": vwap(group_df), "qty": sum_qty(group_df), "quoteQty": sum_quoteQty(group_df) }) # 直接对重采样对象应用该函数 resample_result = r.apply(group_aggregate)
方案2:拆分单列聚合与跨列聚合逻辑
如果仅少数函数需要跨列计算,其余均为单列聚合,可分开处理两类逻辑:
# 先处理所有单列聚合需求 resample_result = r.agg({ "qty": sum_qty, "quoteQty": sum_quoteQty }) # 单独计算需要跨列的vwap字段 resample_result["price"] = r.apply(vwap)
内容的提问来源于stack exchange,提问作者LMD
相关产品推荐
相关产品推荐

