Pandas滚动窗口apply报错TypeError:需实数而非NoneType求助
报错原因与解决方案
报错原因
- lambda返回值不符合要求:
rolling().apply()中使用的lambda r: print(r)返回None,而pandas的滚动窗口apply要求每个窗口计算必须返回实数(int/float),None类型触发了类型错误。 - 存在缺失值:
candidates列有10949个NaN,滚动窗口包含NaN时,会干扰数值计算逻辑,即使修正返回值问题,也可能导致结果异常。
解决方法
1. 替换无效的lambda逻辑
将用于调试的print(r)替换为实际业务需要的数值计算,比如窗口均值、求和等:
# 示例:计算7天窗口的均值 rolling_result = df_price_population.groupby(['danji_id', 'area1'])['candidates'].rolling(window=7).apply(lambda r: r.mean())
2. 处理缺失值
根据业务场景选择以下方式:
方式一:填充缺失值(保留数据)
- 按分组填充组内均值:
df_price_population['candidates'] = df_price_population.groupby(['danji_id', 'area1'])['candidates'].transform(lambda x: x.fillna(x.mean()))
- 时序数据可使用前向填充:
df_price_population['candidates'] = df_price_population.groupby(['danji_id', 'area1'])['candidates'].fillna(method='ffill')
方式二:删除含缺失值的行
df_price_population = df_price_population.dropna(subset=['candidates'])
完整流程示例
# 第一步:处理缺失值 df_price_population['candidates'] = df_price_population.groupby(['danji_id', 'area1'])['candidates'].transform(lambda x: x.fillna(x.mean())) # 第二步:执行滚动窗口计算 rolling_result = df_price_population.groupby(['danji_id', 'area1'])['candidates'].rolling(window=7).apply(lambda r: r.mean())
内容的提问来源于stack exchange,提问作者verystrongjoe
相关产品推荐
相关产品推荐

