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

Python DataFrame比较操作中避免丢弃含NaN的有效行

问题:筛选DataFrame中非NaN值均在指定区间的行

原始数据与需求

数据定义

import pandas as pd
import numpy as np

xdf = pd.DataFrame(
    data={'A': [-10, np.nan, -2.2], 'B': [np.nan, 2, 1.5], 'C': [3, 1, -0.3]},
    index=['2023-05-13 08:40:00', '2023-05-13 08:41:00', '2023-05-13 08:42:00']
)

数据预览:

A      B      C
2023-05-13 08:40:00  -10.0    NaN    3.0
2023-05-13 08:41:00    NaN    2.0    1.0
2023-05-13 08:42:00   -2.2    1.5   -0.3

需求

筛选出每行所有非NaN值都处于-4.0到4.0开区间内的行。

现有代码问题

尝试使用以下代码筛选:

print(xdf[((xdf < 4.0).all(axis=1)) & ((xdf > -4.0).all(axis=1))])

当前输出:

A      B      C
2023-05-13 08:42:00   -2.2    1.5   -0.3

问题:NaN在布尔判断中会被视为False,导致只要行内存在NaN,整行就会被排除,无法保留2023-05-13 08:41:00这一行(该行非NaN值均符合区间要求)。

期望输出

A      B      C
2023-05-13 08:41:00    NaN    2.0    1.0
2023-05-13 08:42:00   -2.2    1.5   -0.3

解决方案

将NaN替换为布尔值True,这样在all()判断时会自动忽略这些位置,仅验证非NaN值是否符合区间要求。

基础实现代码

print(xdf[((xdf.fillna(True) < 4.0).all(axis=1)) & ((xdf.fillna(True) > -4.0).all(axis=1))])

简化写法

利用between()合并区间判断,代码更简洁:

# inclusive='neither' 对应开区间(-4.0, 4.0),需要包含边界可改为'inclusive=both'
print(xdf[(xdf.fillna(True).between(-4.0, 4.0, inclusive='neither')).all(axis=1)])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:05:15