Je travaille actuellement sur un problème de pandas et j'aimerais savoir s'il existe une solution simple à ce problème.

J'ai des tables de pandas qui ont toujours un format qui ressemble à ceci :

df = pd.DataFrame({'A':[1,2,np.nan,np.nan,3],'B':[2,3,np.nan,5,2],'C':[2,3,7,5,9],'D':[1,2,3,np.nan,np.nan]} )

Cette base de données doit être transformée en :

df = pd.DataFrame({'A':[1,2,7,5,3],'B':[2,3,3,5,2],'C':[2,3,np.nan,np.nan,9],'D':[1,2,np.nan,np.nan,np.nan]} )

Cela signifie que toutes les valeurs des colonnes doivent être décalées autant que possible vers la gauche. (La première colonne doit d'abord être remplie, suivie de la seconde, etc.) Existe-t-il une solution simple pour le faire ?

Merci d'avance.

1
Beertje 30 janv. 2020 à 14:31

1 réponse

Meilleure réponse

Utilisez la fonction personnalisée justify, convertissez uniquement DataFrame en tableau numpy :

#https://stackoverflow.com/a/44559180/2901002
df = pd.DataFrame(justify(df.to_numpy(),invalid_val=np.nan), columns=df.columns)
#pandas < 0.24
#df = pd.DataFrame(justify(df.values,invalid_val=np.nan), columns=df.columns)
print (df)
     A    B    C    D
0  1.0  2.0  2.0  1.0
1  2.0  3.0  3.0  2.0
2  7.0  3.0  NaN  NaN
3  5.0  5.0  NaN  NaN
4  3.0  2.0  9.0  NaN

Si les performances ne sont pas importantes, utilisez DataFrame.apply avec Series.dropna et Series constructeur :

df = df.apply(lambda x: pd.Series(x.dropna().to_numpy()), axis=1)
#pandas < 0.24
#df = df.apply(lambda x: pd.Series(x.dropna().values), axis=1)
1
jezrael 30 janv. 2020 à 11:33