J'ai un cadre de données de pandas comme ceci:
Column1 Column2 Column3 Column4 Column5
0 a 1 2 3 4
1 a 3 4 5
2 b 6 7 8
3 c 7 7
Ce que je veux faire maintenant, c'est obtenir un nouveau cadre de données contenant Column1 et un nouveau columnA. Cette colonneA doit contenir toutes les valeurs des colonnes 2 - (à) n (où n est le nombre de colonnes de Column2 à la fin de la ligne) comme ceci:
Column1 ColumnA
0 a 1,2,3,4
1 a 3,4,5
2 b 6,7,8
3 c 7,7
Comment pourrais-je mieux aborder ce problème? Tout conseil serait utile. Merci d'avance!
Vous pouvez appeler apply
passer axis=1
à apply
par rangée, puis convertir le type de données en str
et join
:
In [153]:
df['ColumnA'] = df[df.columns[1:]].apply(
lambda x: ','.join(x.dropna().astype(int).astype(str)),
axis=1
)
df
Out[153]:
Column1 Column2 Column3 Column4 Column5 ColumnA
0 a 1 2 3 4 1,2,3,4
1 a 3 4 5 NaN 3,4,5
2 b 6 7 8 NaN 6,7,8
3 c 7 7 NaN NaN 7,7
Ici, j'appelle dropna
pour me débarrasser de NaN
. Cependant, nous devons rediffuser à int
pour ne pas finir avec des flottants comme str.
Si vous avez beaucoup de colonnes, dites-1000 colonnes dans la structure de données et vous voulez fusionner quelques colonnes en fonction de particular column name
par exemple. -Column2
en question et no arbitraire. de colonnes après cette colonne (par exemple, ici, 3 colonnes après 'Column2
, y compris de Column2
comme OP le demandait).
On peut obtenir la position de la colonne en utilisant .get_loc()
- tel que répondu ici
source_col_loc = df.columns.get_loc('Column2') # column position starts from 0
df['ColumnA'] = df.iloc[:,source_col_loc+1:source_col_loc+4].apply(
lambda x: ",".join(x.astype(str)), axis=1)
df
Column1 Column2 Column3 Column4 Column5 ColumnA
0 a 1 2 3 4 1,2,3,4
1 a 3 4 5 NaN 3,4,5
2 b 6 7 8 NaN 6,7,8
3 c 7 7 NaN NaN 7,7
Pour supprimer NaN
, utilisez .dropna()
ou .fillna()
J'espère que ça aide!