如何高效获取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']]
原理说明:
df1.isna():生成和原DataFrame同形状的布尔矩阵,True代表对应位置是NaN。.stack():把列索引转为内层行索引,将二维表格转为一维的Series,每个元素的索引是(行号, 列名)的元组,值是布尔值。[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
相关产品推荐
相关产品推荐

