python pandas dataframe nan

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 .