使用Pandas GroupBy计算高成交量日均值返回NaN问题排查
问题分析与解决
问题原因
你遇到的NaN问题有两个核心原因:
- 索引不匹配:
df.groupby('symbol')['volume'].mean()的结果是以symbol(ABC、AAA)为索引的Series,而high_volume_days的索引是原DataFrame的行号(0、4、5),Pandas无法自动对齐两者的索引,因此填充NaN。 - 需求匹配错误:你的期望输出需要的是截至当前行,该symbol在高成交量交易日中的累计成交量均值,但原代码用了整个原始DataFrame的分组均值,既不符合需求,也无法正确赋值。
解决方法
使用groupby结合expanding().mean()计算组内滚动累计均值,同时重置索引确保与high_volume_days对齐:
# 计算截至当前行的组内累计成交量均值 high_volume_days['avg_volume_prior_days'] = high_volume_days.groupby('symbol')['volume'].expanding().mean().reset_index(level=0, drop=True)
代码解释
expanding().mean():对每个symbol分组,计算从组内第一行到当前行的成交量均值,完全匹配你的期望输出逻辑。reset_index(level=0, drop=True):移除groupby生成的symbol层级索引,让结果的索引与high_volume_days保持一致,确保赋值时能正确对齐。
验证结果
运行上述代码后,输出将与你的期望完全一致:
date symbol change volume previous_high_volume_day avg_volume_prior_days 0 2022-01-01 ABC 20 20000000 NaN 20000000.0 4 2022-01-05 AAA 50 40000000 NaN 40000000.0 5 2022-01-06 AAA 100 60000000 40000000.0 50000000.0
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

