一尘不染

将NaN移至其各自行的末尾

python

我有一个像这样的DataFrame:

     0    1    2
0  0.0  1.0  2.0
1  NaN  1.0  2.0
2  NaN  NaN  2.0

我想要得到的是

Out[116]: 
     0    1    2
0  0.0  1.0  2.0
1  1.0  2.0  NaN
2  2.0  NaN  NaN

到目前为止,这是我的方法。

df.apply(lambda x : (x[x.notnull()].values.tolist()+x[x.isnull()].values.tolist()),1)
Out[117]: 
     0    1    2
0  0.0  1.0  2.0
1  1.0  2.0  NaN
2  2.0  NaN  NaN

有没有有效的方法来实现这一目标?apply这是减慢速度的方法。谢谢您的助手!:)


我的真实数据大小

df.shape
Out[117]: (54812040, 1522)

阅读 138

收藏
2020-12-20

共1个答案

一尘不染

这是使用justify-的NumPy解决方案-

In [455]: df
Out[455]: 
     0    1    2
0  0.0  1.0  2.0
1  NaN  1.0  2.0
2  NaN  NaN  2.0

In [456]: pd.DataFrame(justify(df.values, invalid_val=np.nan, axis=1, side='left'))
Out[456]: 
     0    1    2
0  0.0  1.0  2.0
1  1.0  2.0  NaN
2  2.0  NaN  NaN

如果要节省内存,请改回分配-

df[:] = justify(df.values, invalid_val=np.nan, axis=1, side='left')
2020-12-20