将NaNs移动到各自行的末尾

WeN*_*Ben 5 python nan dataframe pandas

我有一个像DataFrame:

     0    1    2
0  0.0  1.0  2.0
1  NaN  1.0  2.0
2  NaN  NaN  2.0
Run Code Online (Sandbox Code Playgroud)

我想得到的是

Out[116]: 
     0    1    2
0  0.0  1.0  2.0
1  1.0  2.0  NaN
2  2.0  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

这是我现在的做法.

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
Run Code Online (Sandbox Code Playgroud)

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


我的实际数据大小

df.shape
Out[117]: (54812040, 1522)
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 7

这是一个NumPy解决方案使用justify-

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
Run Code Online (Sandbox Code Playgroud)

如果你想节省内存,请改为分配 -

df[:] = justify(df.values, invalid_val=np.nan, axis=1, side='left')
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 5

最简单选择是使用sortedondf.apply/df.transform并按 nullity 排序。

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
Run Code Online (Sandbox Code Playgroud)

您也可以转入np.isnan论点key