6 votes

Plus d'une valeur avec une virgule dans un dataframe pandas

colonne 1, colonne2 a,b,c 30 b,c,f 40 a,g,z 50 . . . En utilisant le dataframe ci-dessus avec col1,2 j'aimerais avoir le dataframe comme ci-dessous avec col3, 4. De plus, col1 est constitué de valeurs avec des virgules. col4 est constitué de la somme de col2 suivant col3. colonne3, colonne4 a 80 b 70 c 70 f 40 g 50 z 50

6voto

jezrael Points 290608

Utilisation :

df = (df.set_index('colum2')['colum1']
        .str.split(',', expand=True)
        .stack()
        .reset_index(name='column3')
        .groupby('column3', as_index=False)['colum2']
        .sum()
        .rename(columns={'colum2':'column4'})
      )
print (df)
  column3  column4
0       a       80
1       b       70
2       c       70
3       f       40
4       g       50
5       z       50

Explication :

  1. Tout d'abord set_index par colonne colum2
  2. Créer un DataFrame par split
  3. Remodeler par stack
  4. Créer un index par colonnes par reset_index
  5. groupby et agréger sum
  6. Enfin, renommer les colonnes si nécessaire

Une autre solution :

from itertools import chain

a = df['colum1'].str.split(',')
lens = a.str.len()

df = pd.DataFrame({
    'column3' : list(chain.from_iterable(a)), 
    'column4' : df['colum2'].repeat(lens)
}).groupby('column3', as_index=False)['column4'].sum()

print (df)
  column3  column4
0       a       80
1       b       70
2       c       70
3       f       40
4       g       50
5       z       50

Explication :

  1. Créer des listes par split
  2. Obtenir les longueurs des listes par len
  3. Enfin, repeat des colonnes et aplatir colum1
  4. groupby et agréger sum

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X