我有一个像这样的数据框:
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)
最佳答案
这是一个使用 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')
关于python - 将 NaN 移到各自行的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45970751/