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
Réponse
Trop de publicités?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 :
- Tout d'abord
set_index
par colonnecolum2
- Créer un
DataFrame
parsplit
- Remodeler par
stack
- Créer un index par colonnes par
reset_index
groupby
et agrégersum
- 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 :