检索pandas数据帧中的NaN值索引

doo*_*oms 6 python machine-learning pandas

我尝试为包含NaN值的每一行检索相应列的所有索引.

d=[[11.4,1.3,2.0, NaN],[11.4,1.3,NaN, NaN],[11.4,1.3,2.8, 0.7],[NaN,NaN,2.8, 0.7]]
df = pd.DataFrame(data=d, columns=['A','B','C','D'])
print df

      A    B    C    D
0  11.4  1.3  2.0  NaN
1  11.4  1.3  NaN  NaN
2  11.4  1.3  2.8  0.7
3  NaN   NaN  2.8  0.7
Run Code Online (Sandbox Code Playgroud)

我已经做了以下事情:

  • 添加每行的NaN计数列
  • 获取包含NaN值的每一行的索引

我想要的(理想情况下,列的名称)是这样的列表:

[ ['D'],['C','D'],['A','B'] ]
Run Code Online (Sandbox Code Playgroud)

希望我能找到一种方法,而不是为每一行测试每一行

if df.ix[i][column] == NaN:
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种能够处理我庞大数据集的熊猫方式.

提前致谢.

max*_*moo 5

使用 scipy 坐标格式稀疏矩阵来检索空值的坐标应该是有效的:

import scipy.sparse as sp

x,y = sp.coo_matrix(df.isnull()).nonzero()
print(list(zip(x,y)))

[(0, 3), (1, 2), (1, 3), (3, 0), (3, 1)]
Run Code Online (Sandbox Code Playgroud)

请注意,我调用该nonzero方法是为了仅输出底层稀疏矩阵中非零条目的坐标,因为我不关心所有True.


And*_*den 3

另一种方法是提取 NaN 的行:

In [11]: df_null = df.isnull().unstack()

In [12]: t = df_null[df_null]

In [13]: t
Out[13]:
A  3    True
B  3    True
C  1    True
D  0    True
   1    True
dtype: bool
Run Code Online (Sandbox Code Playgroud)

这可以帮助您完成大部分工作,并且可能就足够了。
尽管使用该系列可能更容易:

In [14]: s = pd.Series(t2.index.get_level_values(1), t2.index.get_level_values(0))

In [15]: s
Out[15]:
0    D
1    C
1    D
3    A
3    B
dtype: object
Run Code Online (Sandbox Code Playgroud)

例如,如果您想要列表(尽管我认为您不需要它们)

In [16]: s.groupby(level=0).apply(list)
Out[16]:
0       [D]
1    [C, D]
3    [A, B]
dtype: object
Run Code Online (Sandbox Code Playgroud)