Pour appliquer une agrégation sur un groupby pour une seule colonne est:
df.groupby('column_name1')['column_name2'].agg(sum)
J'ai des données que je voudrais appliquer sum () sur column2 si column1 contient la valeur A, et count ( ) si la valeur est B.
Quelle est la syntaxe pour accomplir cela?
J'essayais d'écrire une boucle for avec une instruction if, mais j'espérais qu'il y avait une meilleure façon d'accomplir cela.
3 Réponses :
Essayez d'utiliser les deux lignes ci-dessous:
df[df['column_name1'].str.contains('A')]=df[df['column_name1'].str.contains('A')].groupby('column_name1')['column_name2'].agg(sum)
df[df['column_name1'].str.contains('B')]=df[df['column_name1'].str.contains('B')].groupby('column_name1')['column_name2'].agg('count')
Existe-t-il un moyen de combiner cela en 1 opération pour enregistrer les résultats dans le même df?
@BenCWang Ils le sont déjà, voir print (df) , il renvoie le dataframe attendu.
Vous pouvez écrire une fonction pour cela (vous pouvez évidemment la personnaliser comme vous le souhaitez):
def my_func(row):
b = row[row.column_name1.str.contains('A')].column_name2.sum()
c = row[row.column_name1.str.contains('B')].column_name2.count()
return pd.Series({'Sum':b, 'Count':c})
df.groupby('column_name1').apply(my_func).reset_index()
column_name1 Sum Count
0 A 8 0
1 B 0 2
Utilisez une fonction personnalisée avec GroupBy.apply :
df = pd.DataFrame({
'column_name1': ['A','A','A','A1','B','B1','C'],
'column_name2': np.arange(1, 8)
})
print (df)
column_name1 column_name2
0 A 1
1 A 2
2 A 3
3 A1 4
4 B 5
5 B1 6
6 C 7
def f(x):
if x.column_name1.str.contains('A').any():
return x['column_name2'].sum()
elif x.column_name1.str.contains('B').any():
return x['column_name2'].count()
else:
return 0
df = df.groupby('column_name1').apply(f).reset_index(name='new')
print (df)
column_name1 new
0 A 6
1 A1 4
2 B 1
3 B1 1
4 C 0