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)
这是一个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)
最简单的选择是使用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。
| 归档时间: |
|
| 查看次数: |
767 次 |
| 最近记录: |