web-dev-qa-db-fra.com

Fusionner plusieurs valeurs de colonne en une colonne dans des pandas en python

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!

16
sequence_hard

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.

32
EdChum

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!

1
Om Prakash