我有一个带有大量NaN的大数据框,我想将其存储到一个较小的数据框中,该数据框存储所有索引以及非NaN,非零值的值。

dff = pd.DataFrame(np.random.randn(4,3), columns=list('ABC'))
dff.iloc[0:2,0] = np.nan
dff.iloc[2,2] = np.nan
dff.iloc[1:4,1] = 0


数据帧可能如下所示:

    A              B             C
0   NaN         -2.268882      0.337074
1   NaN         0.000000       1.340350
2   -1.526945   0.000000       NaN
3   -1.223816   0.000000      -2.185926


我想要一个数据框如下所示:

0   B  -2.268882
0   C  0.337074
1   C  1.340350
2   A  -1.526945
3   A  -1.223816
4   C  -2.185926


我有一个相对较大的数据框架,成千上万个...我该如何快速做到这一点?

非常感谢!

最佳答案

0替换为np.nan,并将.stack()替换为(see docs)

如果有可能在np.nan之后的rows中具有所有.replace()值,则可以在.dropna(how='all')之前执行.stack()以减少要旋转的行数。如果这可能适用于columns,请执行.dropna(how ='all',axis = 1)。

df.replace(0, np.nan).stack()

0  B   -2.268882
   C    0.337074
1  C    1.340350
2  A   -1.526945
3  A   -1.223816
   C   -2.185926


根据需要与.reset_index()结合。

要从带有SeriesMultiIndex中进行选择,请使用.loc[(level_0, level_1)]

df.loc[(0, 'B')] = -2.268882


docs中有关切片等的详细信息。

关于python - 如何从DataFrame获取非NaN元素的索引和值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37211689/

10-10 14:07
查看更多