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

4

我应该如何迭代以下数据框并返回非NaN值的位置作为元组。例如:

df:

     0    1    2
0    NaN NaN   1
1    1   NaN  NaN
2    NaN  2   NaN

我会得到一个输出 [(0, 1), (2, 0), (1, 2)]。最好的方法是使用嵌套循环吗?还是 Pandas 中有一种我不知道的更简单的方法呢?

3个回答

8
假设您不需要按顺序,可以堆叠非空值并处理索引值。
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]])

此外,使用堆栈方法,NaN 会被忽略。
In [28]: list(df.stack().index)
Out[28]: [(0L, '2'), (1L, '0'), (2L, '1')]

5
获取非空位置:
import numpy as np

>>> np.argwhere(df.notnull().values).tolist()
[[0, 2], [1, 0], [2, 1]]

如果您确实希望将它们作为元组对,请使用列表推导式:
>>> [tuple(pair) for pair in np.argwhere(df.notnull().values).tolist()]
[(0, 2), (1, 0), (2, 1)]

获取空值的位置:
>>> np.argwhere(df.isnull().values).tolist()
[[0, 0], [0, 1], [1, 1], [1, 2], [2, 0], [2, 2]]

可以像这样将numpy数组转换为元组:map(tuple, np.argwhere(df.notnull().values))。然而,这种方法的一个问题是,如果数据框具有非索引列名,例如[a,b,c]等,则会出现问题。 - Zero
我更喜欢使用列表推导式而不是 map。这将返回整数索引位置,而不是列/索引名称(顺便说一下,获取它们很容易)。 - Alexander

1

一种直接的方法:

list(zip(*np.where(df.notnull())))

for

[(0, 2), (1, 0), (2, 1)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接