python - Cambiar NaNs al final de sus respectivas filas
pandas dataframe (2)
Aquí hay una solución NumPy usando
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
Si desea guardar memoria, asígnela de nuevo.
df[:] = justify(df.values, invalid_val=np.nan, axis=1, side=''left'')
Tengo un DataFrame como:
0 1 2
0 0.0 1.0 2.0
1 NaN 1.0 2.0
2 NaN NaN 2.0
Lo que quiero conseguir es
Out[116]:
0 1 2
0 0.0 1.0 2.0
1 1.0 2.0 NaN
2 2.0 NaN NaN
Este es mi enfoque a partir de ahora.
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
¿Hay alguna forma eficiente de lograr esto?
apply
Aquí hay forma de reducir la velocidad.
¡Gracias por su asistente!:)
Mi tamaño real de datos
df.shape
Out[117]: (54812040, 1522)
Su
mejor
opción
más
fácil es usar
sorted
en
df.apply/df.transform
y ordenar por nulidad.
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
También puede pasar
np.isnan
al argumento
key
.