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

如何在Pandas DataFrame中统计每行NaN值并找出最少的行?

问题描述

需要统计DataFrame中每行的NaN值数量,然后找出NaN数量最少的行。当前使用循环的解决方案速度太慢,且不符合Pandas的惯用写法,求更优、更快的实现方法。

原实现代码:

max_not_nan = 13 # a maximum possible value of NaN's (number of columns + 1) 
row_number = 0
for i in range(df.shape[0]):
  if df.iloc[i].isna().sum() < max_not_nan:
    max_not_nan = df.iloc[i].isna().sum()
    row_number = i

该方案功能正常,但时间复杂度较高。

优化方案

利用Pandas的矢量化操作替代循环,能大幅提升效率,同时符合Pandas的惯用写法:

基础实现(清晰易懂)

# 计算每行的NaN数量
row_nan_counts = df.isna().sum(axis=1)
# 获取NaN数量最少的行(若存在多行,返回第一行)
min_nan_row = df.loc[row_nan_counts.idxmin()]
# 若只需要行索引
min_nan_row_idx = row_nan_counts.idxmin()

简洁版实现

min_nan_row = df.loc[df.isna().sum(axis=1).idxmin()]

关键操作解释

  • df.isna():生成与原DataFrame同结构的布尔值表,标记每个单元格是否为NaN
  • .sum(axis=1):按行方向求和,得到每行的NaN总数(axis=1代表行维度)
  • .idxmin():返回NaN数量最小值对应的行索引,直接定位目标行

这种方式依托Pandas底层的NumPy优化,比循环快数倍甚至数十倍,尤其适合大体积的DataFrame。

处理多行NaN数量相同的情况

如果存在多行NaN数量同为最小值的情况,可获取所有符合条件的行:

min_nan_count = row_nan_counts.min()
all_min_nan_rows = df[row_nan_counts == min_nan_count]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:45:43