我有一个非常大的数据集(大约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)]列表。
答案 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倍