88 votes

Passer les percentiles à la fonction agg de pandas

Je veux passer le numpy percentile() par l'intermédiaire de la fonction agg() comme je le fais ci-dessous avec diverses autres fonctions statistiques numpy.

Actuellement, j'ai un cadre de données qui ressemble à ceci :

AGGREGATE   MY_COLUMN
A           10
A           12
B           5
B           9
A           84
B           22

Et mon code ressemble à ceci :

grouped = dataframe.groupby('AGGREGATE')
column = grouped['MY_COLUMN']
column.agg([np.sum, np.mean, np.std, np.median, np.var, np.min, np.max])

Le code ci-dessus fonctionne, mais je veux faire quelque chose comme

column.agg([np.sum, np.mean, np.percentile(50), np.percentile(95)])

C'est-à-dire, spécifier les différents percentiles à retourner à partir de agg() .

Comment faire ?

16voto

jvans Points 441

Je crois que la façon idiomatique de faire cela dans les pandas est :

df.groupby("AGGREGATE").quantile([0, 0.25, 0.5, 0.75, 0.95, 1])

10voto

Maksim Points 30

Pour les situations où vous n'avez besoin que d'un sous-ensemble de l'annuaire de l'entreprise. describe (généralement les statistiques les plus courantes), vous pouvez simplement indexer les séries pandas retournées sans avoir besoin de fonctions supplémentaires.

Par exemple, il m'arrive souvent d'avoir besoin de présenter le 25ème, la médiane, le 75ème et le nombre. Cela peut être fait en une seule ligne comme ceci :

columns.agg('describe')[['25%', '50%', '75%', 'count']]

Pour spécifier votre propre ensemble de percentiles, la réponse choisie est un bon choix, mais pour un cas d'utilisation simple, il n'y a pas besoin de fonctions supplémentaires.

7voto

Antiez Points 179

Une solution plus efficace avec pandas.Series.quantile méthode :

df.groupby("AGGREGATE").agg(("YOUR_COL_NAME", lambda x: x.quantile(0.5))

Avec plusieurs valeurs de percentile

percentiles = [0.5, 0.9, 0.99]
quantile_funcs = [(p, lambda x: x.quantile(p)) for p in percentiles]
df.groupby("AGGREGATE").agg(quantile_funcs)

5voto

Agredalopez Points 51
df.groupby("AGGREGATE").describe(percentiles=[0, 0.25, 0.5, 0.75, 0.95, 1])

par défaut describe fonction nous donnent mean, count, std, min, max et avec le tableau des percentiles, vous pouvez choisir les percentiles nécessaires.

4voto

magraf Points 31

Juste pour proposer une solution plus générale. Supposons que vous ayez un DF avec une seule colonne à regrouper :

df = pd.DataFrame((('A',10),('A',12),('B',5),('B',9),('A',84),('B',22)), 
                    columns=['My_KEY', 'MY_COL1'])

On peut agréger et calculer pratiquement n'importe quelle métrique descriptive avec une liste de fonctions anonymes (lambda) comme :

df.groupby(['My_KEY']).agg( [np.sum, np.mean, lambda x: np.percentile(x, q=25)] )

Cependant, si vous avez plusieurs colonnes à agréger, vous devez appeler une fonction non anonyme ou appeler les colonnes explicitement :

df = pd.DataFrame((('A',10,3),('A',12,4),('B',5,6),('B',9,3),('A',84,2),('B',22,1)), 
                    columns=['My_KEY', 'MY_COL1', 'MY_COL2'])

# non-anonymous function
def percentil25 (x): 
    return np.percentile(x, q=25)

# type 1: call for both columns 
df.groupby(['My_KEY']).agg( [np.sum, np.mean, percentil25 ]  )

# type 2: call each column separately
df.groupby(['My_KEY']).agg( {'MY_COL1': [np.sum, np.mean, lambda x: np.percentile(x, q=25)],
                             'MY_COL2': np.size})

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