如何获取 Pandas 数据框中所有非 NaN 项的行、列索引

Sha*_*ect 2 python nan indices pandas

如何迭代如下所示的数据帧并将非 NaN 值位置作为元组返回。IE

df:

     0    1    2
0    NaN NaN   1
1    1   NaN  NaN
2    NaN  2   NaN
Run Code Online (Sandbox Code Playgroud)

我会得到 [(0, 1), (2, 0), (1, 2)] 的输出。最好的方法是进行嵌套 for 循环吗?或者有没有我不知道的更简单的方法通过 Pandas。

Zer*_*ero 6

假设您不需要按顺序排列,您可以堆叠非空值并处理索引值。

In [26]: list(df[df.notnull()].stack().index)
Out[26]: [(0L, '2'), (1L, '0'), (2L, '1')]

In [27]: df[df.notnull()].stack().index
Out[27]:
MultiIndex(levels=[[0, 1, 2], [u'0', u'1', u'2']],
           labels=[[0, 1, 2], [2, 0, 1]])
Run Code Online (Sandbox Code Playgroud)

此外,使用堆栈方法,NaN无论如何都被忽略。

In [28]: list(df.stack().index)
Out[28]: [(0L, '2'), (1L, '0'), (2L, '1')]
Run Code Online (Sandbox Code Playgroud)


Ale*_*der 5

要获取非空位置:

import numpy as np

>>> np.argwhere(df.notnull().values).tolist()
[[0, 2], [1, 0], [2, 1]]
Run Code Online (Sandbox Code Playgroud)

如果您确实希望它们作为元组对,只需使用列表理解:

>>> [tuple(pair) for pair in np.argwhere(df.notnull().values).tolist()]
[(0, 2), (1, 0), (2, 1)]
Run Code Online (Sandbox Code Playgroud)

要获取空位置:

>>> np.argwhere(df.isnull().values).tolist()
[[0, 0], [0, 1], [1, 1], [1, 2], [2, 0], [2, 2]]
Run Code Online (Sandbox Code Playgroud)