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
相关产品推荐
相关产品推荐

