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

