我应该如何迭代以下数据框并返回非NaN值的位置作为元组。例如:
df:
0 1 2
0 NaN NaN 1
1 1 NaN NaN
2 NaN 2 NaN
我会得到一个输出 [(0, 1), (2, 0), (1, 2)]。最好的方法是使用嵌套循环吗?还是 Pandas 中有一种我不知道的更简单的方法呢?
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')]
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]]
map(tuple, np.argwhere(df.notnull().values))
。然而,这种方法的一个问题是,如果数据框具有非索引列名,例如[a,b,c]
等,则会出现问题。 - Zero一种直接的方法:
list(zip(*np.where(df.notnull())))
for
[(0, 2), (1, 0), (2, 1)]