如何在Pandas中依据股价DataFrame空值清除滚动和DataFrame对应值
解决方案
核心方法(支持批量处理数百列)
直接利用pandas.DataFrame.where()方法,基于股价DataFrame的非缺失值标记,过滤滚动和DataFrame的无效值:
# 生成清理后的滚动和DataFrame,df中为空的位置对应df1置空 df_cleaned = df1.where(df.notna())
方法说明
- df和df1的索引、列完全匹配,
df.notna()会生成一个与两者形状一致的布尔矩阵,标记所有股价非空的位置 where()会保留布尔矩阵中True位置的df1原值,将False位置(即股价为空)置为NaN,完美实现需求- 该方法无需循环,原生支持批量处理任意数量的列,效率极高
你之前代码的问题
- 错误填充缺失值:
df = df.fillna(0)把原本的缺失值转为0,后续转布尔值时会把0判定为False,如果股价本身存在合法的0值,会误删对应滚动和数据 - 错误替换逻辑:
df2.where(df_bool, False)将不符合条件的位置设为False而非空值,不符合需求
示例验证
构造你提供的示例数据并运行上述代码:
import pandas as pd import numpy as np # 构造股价DataFrame df = pd.DataFrame( {'Stock A': [23, 25, 21, np.nan, np.nan, np.nan]}, index=pd.date_range('2022-12-10', periods=6) ) # 构造滚动和DataFrame df1 = pd.DataFrame( {'Rolling sum': [0.54, 0.55, 0.51, 0.49, 0.48, 0.47]}, index=pd.date_range('2022-12-10', periods=6) ) # 清理无效值 df_cleaned = df1.where(df.notna()) print(df_cleaned)
输出结果与你期望的完全一致:
| 索引 | Rolling sum |
|---|---|
| 2022-12-10 | 0.54 |
| 2022-12-11 | 0.55 |
| 2022-12-12 | 0.51 |
| 2022-12-13 | NaN |
| 2022-12-14 | NaN |
| 2022-12-15 | NaN |
内容的提问来源于stack exchange,提问作者Pythonnewbie
相关产品推荐
相关产品推荐

