将NaNs移动到各自行的末尾

时间:2017-08-30 22:41:37

标签: python pandas dataframe nan

我有一个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)

2 个答案:

答案 0 :(得分:5)

这是使用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')

答案 1 :(得分:3)

您的最佳最简单的选项是在sorted上使用df.apply/df.transform并按无效排序。

df = df.apply(lambda x: sorted(x, key=pd.isnull), 1)
df
     0    1    2
0  0.0  1.0  2.0
1  1.0  2.0  NaN
2  2.0  NaN  NaN

您也可以将np.isnan传递给key参数。