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

含NaN值的复杂筛选问题:无需替换NaN的loc筛选方法

无需替换NaN,直接筛选特定类别下的缺失值

嘿,这个问题其实不用绕远路——Pandas本身就提供了原生的缺失值检测方法,完全可以直接结合你的meter_id条件筛选数据,根本不需要先把NaN替换成-1。

核心逻辑

直接把「meter_id属于目标类别」和「Values列为NaN」这两个条件组合起来,用布尔索引或者loc就能精准提取你要的行。

具体代码实现

假设你的DataFrame名为df,下面给你两种等效的实现方式,适配不同Pandas版本:

方法1:用isna()(推荐,Pandas 0.21+版本可用)

这是Pandas官方推荐的现代写法,语义更清晰:

import pandas as pd
import numpy as np

# 先搭个示例DataFrame方便你测试
df = pd.DataFrame({
    'meter_id': ['METER_001', 'METER_001', 'METER_002', 'METER_001'],
    'Values': [150, np.nan, 220, np.nan]
})

# 筛选meter_id为'METER_001'且Values是NaN的行
filtered_data = df.loc[(df['meter_id'] == 'METER_001') & df['Values'].isna()]
print(filtered_data)

方法2:用isnull()(兼容旧版Pandas)

如果你的Pandas版本比较老,isnull()和isna()功能完全一致,也能达到同样效果:

filtered_data = df.loc[(df['meter_id'] == 'METER_001') & df['Values'].isnull()]

代码说明

  • df['Values'].isna()会生成一个布尔Series,每一行标记Values是否为NaN
  • 用&(逻辑与)把两个条件组合起来,注意一定要给每个条件加括号,避免运算优先级出错
  • loc会根据这个布尔索引,直接提取所有符合条件的行

扩展:筛选多个目标meter_id

如果需要同时处理多个meter_id类别,用isin()更高效:

# 定义要筛选的meter_id列表
target_meters = ['METER_001', 'METER_003']
# 批量筛选这些类别下的NaN值行
filtered_data = df.loc[df['meter_id'].isin(target_meters) & df['Values'].isna()]

这样操作既简洁又高效,完全不用碰替换NaN的步骤,直接拿到你需要的数据~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:48:27