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

如何在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,完美实现需求
  • 该方法无需循环,原生支持批量处理任意数量的列,效率极高

你之前代码的问题

  1. 错误填充缺失值:df = df.fillna(0)把原本的缺失值转为0,后续转布尔值时会把0判定为False,如果股价本身存在合法的0值,会误删对应滚动和数据
  2. 错误替换逻辑: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-100.54
2022-12-110.55
2022-12-120.51
2022-12-13NaN
2022-12-14NaN
2022-12-15NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:50:21