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

如何高效获取Pandas DataFrame中所有NaN值的坐标对?

获取DataFrame中所有NaN值的坐标

这个需求很容易实现,用Pandas和NumPy的内置向量化方法就能高效搞定,完全不用手动遍历(手动循环在数据量大的时候会很慢),给你两种实用方案:

方案一:用Pandas的stack()方法

先修正你的DataFrame定义(注意要把Nan改成np.nan,否则Pandas识别不了),然后执行以下代码:

import pandas as pd
import numpy as np

# 初始化你的DataFrame
df1 = pd.DataFrame({ 
    'A': ['1', '2', '3', '4', '5'], 
    'B': ['1', '1', '1', '1', '1'], 
    'C': ['c', 'A1', np.nan, 'c3', np.nan], 
    'D': ['d0', 'B1', 'B2', np.nan, 'B4'], 
    'E': ['A', np.nan, 'S', np.nan, 'S'], 
    'F': ['3', '4', '5', '6', '7'], 
    'G': ['2', '2', np.nan, '2', '2'] 
})

# 核心步骤:获取所有NaN的坐标对
nan_mask = df1.isna()  # 生成布尔矩阵,标记NaN位置
nan_coords = nan_mask.stack()[lambda x: x].index.tolist()  # 筛选出True的位置并提取索引
result = [[idx[0], idx[1]] for idx in nan_coords]  # 转换成你要的格式

print(result)

运行后输出就是你想要的:

[[1, 'E'], [2, 'C'], [2, 'G'], [3, 'D'], [3, 'E'], [4, 'C']]

原理说明:

  1. df1.isna():生成和原DataFrame同形状的布尔矩阵,True代表对应位置是NaN。
  2. .stack():把列索引转为内层行索引,将二维表格转为一维的Series,每个元素的索引是(行号, 列名)的元组,值是布尔值。
  3. [lambda x: x]:筛选出值为True的元素(也就是NaN的位置),再提取它们的索引,最后转成列表。

方案二:用NumPy的np.where()方法

如果你更习惯用NumPy的向量化操作,这种方法也很高效:

import pandas as pd
import numpy as np

# 同样先初始化DataFrame(代码同上,省略)

# 获取所有NaN的行号和列索引位置
rows, cols = np.where(df1.isna())
# 将列索引转换成列名,再组合成目标格式
result = [[row, df1.columns[col]] for row, col in zip(rows, cols)]

print(result)

原理说明:

np.where(df1.isna())会返回两个数组,分别是所有NaN位置的行号和列的索引值,然后我们用df1.columns[col]把列索引转成对应的列名,再和行号组合成你要的坐标对。

这两种方法都是向量化操作,处理大数据集时比手动循环快几十甚至上百倍,非常高效。

内容的提问来源于stack exchange,提问作者Simon Chemnitz-Thomsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:05:34