3
votes

Comment appliquer l'agrégation conditionnelle aux séries?

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.


0 commentaires

3 Réponses :


2
votes

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')


2 commentaires

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.



1
votes

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


0 commentaires

1
votes

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


0 commentaires