Pandas滚动窗口技术问题:返回未应用额外函数的滚动窗口DataFrame及过滤非NaN值不足元素
问题2:滚动窗口内非NaN值数量不足时替换为NaN
你之前的代码报错,是因为rolling.apply()默认要求返回聚合后的标量或一维结果,直接返回整个窗口的x不符合它的预期。我们换个思路,先算每个窗口的非NaN数量,再根据阈值过滤就行:
情况1:按每列单独判断非NaN数量
如果需要针对每列单独校验(某列的滚动窗口内非NaN数≥min_periods,才保留该列当前值):
window_size = 4 min_periods = 2 # 计算每列的滚动非NaN计数 col_rolling_count = df.rolling(window_size).count() # 仅保留计数达标的列值,否则设为NaN result = df.where(col_rolling_count >= min_periods)
情况2:按整个窗口总非NaN数判断
如果要求整个滚动窗口的非NaN总数≥min_periods,才保留当前行的所有值:
window_size = 4 min_periods = 2 # 计算每个滚动窗口内的非NaN总数 total_rolling_count = df.rolling(window_size).count().sum(axis=1) # 总数达标则保留原值,否则整行设为NaN result = df.where(total_rolling_count >= min_periods, np.nan)
这两种方法既避开了apply()的限制,运行效率也比自定义lambda更高,你可以根据实际需求选其中一种。
内容的提问来源于stack exchange,提问作者lazarea
相关产品推荐
相关产品推荐

