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

如何高效移除Pandas DataFrame中包含NaN数组的行?

高效过滤含NaN数组的DataFrame行

你的循环删除方案效率很低,尤其是数据量大的时候——每次drop都会重构DataFrame,时间复杂度是O(n²),还可能因为索引变化导致漏删。直接用isnull无效是因为它只检查数组对象本身是否为NaN,而非数组内部的元素。

这里提供两种简洁高效的向量化解决方案:

方案一:逐列检查后合并条件

先定义一个检查数组是否含NaN的辅助函数,再对目标列应用后过滤:

import numpy as np

def has_nan(arr):
    return np.isnan(arr).any()

# 保留e、f、g列的数组都不含NaN的行
filtered_df = df[
    ~df['e'].apply(has_nan) & 
    ~df['f'].apply(has_nan) & 
    ~df['g'].apply(has_nan)
]

方案二:更紧凑的写法

用applymap一次性处理所有目标列,再按行判断:

# 过滤掉任意一列数组含NaN的行
filtered_df = df[~df[['e', 'f', 'g']].applymap(lambda x: np.isnan(x).any()).any(axis=1)]

代码解释

  • np.isnan(arr).any():检查数组中是否存在至少一个NaN值,返回布尔值。
  • applymap(lambda x: ...):对e、f、g列的每个数组元素执行检查,生成一个布尔DataFrame。
  • .any(axis=1):按行判断,只要该行任意一列的数组含NaN,就标记为True。
  • ~:取反操作,保留所有行均无NaN的记录。

为什么比原方案好

  • 向量化操作时间复杂度为O(n),远快于循环删除的O(n²)。
  • 避免了循环中索引变化导致的错误(比如删除行后后续索引错位)。
  • 代码更简洁易读,便于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:54:23