Il existe deux versions de agg (abréviation de aggregate) et de apply : La première est définie sur les objets groupby et la seconde est définie sur les DataFrames.
Si vous considérez groupby.agg
y groupby.apply
la principale différence serait que la demande est flexible ( docs ):
Certaines opérations sur les données groupées peuvent ne pas correspondre à l'une ou l'autre des catégories suivantes catégories d'agrégation ou de transformation. Ou encore, vous pouvez simplement vouloir que GroupBy déduire comment combiner les résultats. Dans ce cas, utilisez la fonction apply, qui peut remplacer à la fois aggregate et transform dans de nombreux cas d'utilisation standard. cas d'utilisation standard.
Remarque : apply peut agir comme une fonction de réduction, de transformation ou de filtrage, en fonction de ce qui est passé à apply. Ainsi, en fonction du chemin et de ce que vous regroupez exactement. Ainsi, la ou les colonnes regroupées peuvent être incluses dans la sortie ainsi que définir les indices.
Voir Python Pandas : Comment retourner des listes groupées dans une colonne comme un dict ? par exemple pour une illustration de la manière dont le type de retour est automatiquement modifié.
groupby.agg
d'autre part, est très bon pour appliquer les fonctions optimisées de Cython (c'est-à-dire être capable de calculer 'sum'
, 'mean'
, 'std'
etc. très rapidement). Il permet également de calculer plusieurs fonctions (différentes) sur différentes colonnes. Par exemple,
df.groupby('some_column').agg({'first_column': ['mean', 'std'],
'second_column': ['sum', 'sem']}
calcule la moyenne et l'écart-type sur la première colonne et la somme et l'erreur standard de la moyenne sur la deuxième colonne. Voir dplyr summarize équivalent en pandas pour d'autres exemples.
Ces différences sont également résumées dans Quelle est la différence entre la fonction pandas agg et la fonction apply ? Mais celui-ci se concentre sur les différences entre groupby.agg
y groupby.apply
.
DataFrame.agg
est nouveau dans la version 0.20. Auparavant, nous n'étions pas en mesure d'appliquer plusieurs fonctions différentes à des colonnes différentes, car cela n'était possible qu'avec les objets groupby. Désormais, vous pouvez résumer un DataFrame en calculant plusieurs fonctions différentes sur ses colonnes. Exemple de Existe-t-il un équivalent pandas de dplyr::summarise ? :
iris.agg({'sepal_width': 'min', 'petal_width': 'max'})
petal_width 2.5
sepal_width 2.0
dtype: float64
iris.agg({'sepal_width': ['min', 'median'], 'sepal_length': ['min', 'mean']})
sepal_length sepal_width
mean 5.843333 NaN
median NaN 3.0
min 4.300000 2.0
Cela n'est pas possible avec DataFrame.apply
. Il va soit colonne par colonne, soit ligne par ligne et exécute la même fonction sur cette colonne/ligne. Pour une seule fonction comme lambda x: x**2
ils produisent les mêmes résultats mais leur utilisation prévue est très différente.