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

使用Pandas rolling apply返回字典触发TypeError的原因咨询

报错原因及解决思路

报错根本原因

Pandas 1.5.3版本的rolling.apply()对自定义函数的返回值有强制要求:必须返回单个数值类型(整数、浮点数等),不支持返回字典、列表这类复合数据结构。

你的custom_rolling_apply函数返回的是字典,rolling.apply()在处理每个窗口的结果时,会尝试将返回值转换为实数类型存入DataFrame列,但字典无法完成这个转换,因此直接抛出TypeError: must be real number, not dict。即使你提前将目标列设为object类型也无效,因为rolling.apply()内部会先校验返回值类型,不会直接接受复合对象。

替代解决方案

如果需要同时获取窗口的求和与均值结果,推荐两种更合适的实现方式:

方式1:分开计算单个统计量

直接调用Pandas内置的滚动统计方法,简洁高效:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, 3, 4, 5]})
df['rolling_sum'] = df['A'].rolling(window=3).sum()
df['rolling_mean'] = df['A'].rolling(window=3).mean()

方式2:用rolling.agg()批量计算后转字典

如果确实需要将结果存入字典列,可以先通过agg()批量计算统计量,再逐行转换为字典:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, 3, 4, 5]})
# 批量计算窗口sum和mean
rolling_stats = df['A'].rolling(window=3).agg(['sum', 'mean'])
# 转换为字典列
df['rolling_dict'] = rolling_stats.apply(lambda row: {'sum': row['sum'], 'mean': row['mean']}, axis=1)

内容的提问来源于stack exchange,提问作者user2165656

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:12:38