在Pandas DataFrame中查找非NaN值的索引

时间:2016-12-14 19:04:36

标签: python-2.7 pandas dataframe

我有一个非常大的数据集(大约200000x400),但我已经过滤了,只剩下几百个值,其余的是NaN。我想创建一些剩余值的索引列表。我似乎无法找到一个简单的解决方案。

    0     1     2
0   NaN   NaN   1.2
1   NaN   NaN   NaN   
2   NaN   1.1   NaN   
3   NaN   NaN   NaN
4   1.4   NaN   1.01

例如,我想要一个[(0,2),(2,1),(4,0),(4,2)]列表。

2 个答案:

答案 0 :(得分:3)

将数据帧转换为等效的NumPy数组表示,并检查是否存在NaNs。之后,使用numpy.argwhere取消它的相应索引(表示非空值)。由于所需的输出必须是元组列表,因此您可以使用生成器map函数将tuple作为函数应用于结果数组的每个可迭代函数。

>>> list(map(tuple, np.argwhere(~np.isnan(df.values))))
[(0, 2), (2, 1), (4, 0), (4, 2)]

答案 1 :(得分:1)

假设您的列名称为rowsum(+(!is.na(toy_df[-4])), group=toy_df[,4]) # Y X1 X2 #A 1 1 1 #B 2 0 2 #C 1 0 0 dtype:

int

如果您的列名称为In [73]: df Out[73]: 0 1 2 0 NaN NaN 1.20 1 NaN NaN NaN 2 NaN 1.1 NaN 3 NaN NaN NaN 4 1.4 NaN 1.01 In [74]: df.columns.dtype Out[74]: dtype('int64') In [75]: df.stack().reset_index().drop(0, 1).apply(tuple, axis=1).tolist() Out[75]: [(0, 2), (2, 1), (4, 0), (4, 2)] dtype:

object

50K行的时间DF:

In [81]: df.columns.dtype
Out[81]: dtype('O')

In [83]: df.stack().reset_index().astype(int).drop(0,1).apply(tuple, axis=1).tolist()
Out[83]: [(0, 2), (2, 1), (4, 0), (4, 2)]

结论: Nickil Maveli's solution对于此测试DF来说快12倍