it-swarm.com.de

Perzentile an Pandas Agg-Funktion übergeben

Ich möchte die numpy Percentile () - Funktion über die agg () - Funktion von Pandas übergeben, wie ich es mit verschiedenen anderen Numpy-Statistikfunktionen mache.

Im Moment habe ich einen Datenrahmen, der so aussieht:

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

Und mein Code sieht so aus:

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

Der obige Code funktioniert, aber ich möchte etwas tun 

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

d. h. verschiedene Perzentile angeben, die von agg () zurückgegeben werden sollen

Wie soll das gemacht werden?

24
slizb

Vielleicht nicht besonders effizient, aber eine Möglichkeit wäre, eine Funktion selbst zu erstellen:

def percentile(n):
    def percentile_(x):
        return np.percentile(x, n)
    percentile_.__= 'percentile_%s' % n
    return percentile_

Dann fügen Sie dies in Ihre agg ein:

In [11]: column.agg([np.sum, np.mean, np.std, np.median,
                     np.var, np.min, np.max, percentile(50), percentile(95)])
Out[11]:
           sum       mean        std  median          var  amin  amax  percentile_50  percentile_95
AGGREGATE
A          106  35.333333  42.158431      12  1777.333333    10    84             12           76.8
B           36  12.000000   8.888194       9    79.000000     5    22             12           76.8

Beachten Sie, dass dies so ist, dass sollte jedoch durchgeführt werden ...

56
Andy Hayden

Genauer gesagt, wenn Sie Ihre Pandas-Gruppe anhand der Perzentil-Funktion nur nach Ergebnissen zusammenfassen möchten, bietet die Python-Lambda-Funktion eine recht ordentliche Lösung. Verwenden Sie die Notation der Frage, die nach Perzentil 95 aggregiert wird:

dataframe.groupby('AGGREGATE').agg(lambda x: np.percentile(x['COL'], q = 95))

Sie können diese Funktion auch einer Variablen zuordnen und in Verbindung mit anderen Aggregationsfunktionen verwenden.

9
MonkeyButter

Versuchen Sie dies für das 50% und 95% Perzentil:

column.describe( percentiles = [ 0.5, 0.95 ] )
7
scottlittle

Agg () kann eine benutzerdefinierte Funktion verwenden, die für die angegebene Spalte ausgeführt wird:

# 50th Percentile
def q50(x):
            return x.quantile(0.5)

# 90th Percentile
def q90(x):
            return x.quantile(0.9)

my_DataFrame.groupby(['AGGREGATE']).agg({'MY_COLUMN': [q50, q90, 'max']})
3
Arun Nalpet

Mehrere Funktionen können wie folgt aufgerufen werden:

import pandas as pd

import numpy as np

import random

C = ['Ram', 'Ram', 'Shyam', 'Shyam', 'Mahima', 'Ram', 'Ram', 'Shyam', 'Shyam', 'Mahima']

A = [ random.randint(0,100) for i in range(10) ]

B = [ random.randint(0,100) for i in range(10) ]

df = pd.DataFrame({ 'field_A': A, 'field_B': B, 'field_C': C })

print(df)

d = df.groupby('field_C')['field_A'].describe()[['mean', 'count', '25%', '50%', '75%']]
print(d)

Ich konnte den Median hier nicht aufrufen, konnte aber andere Funktionen ausführen.

1
Fakira

Ich mag die Lösung, die Andy Hayden gegeben hat , allerdings hatte dies mehrere Probleme für mich:

  • Wenn der Datenrahmen mehrere Spalten hat, wurde er über den Spalten und nicht über den Zeilen aggregiert.
  • Für mich waren die Zeilennamen Percentile_0.5 (Punkt statt Unterstrich). Ich bin mir nicht sicher, was dies verursacht hat, wahrscheinlich dass ich Python 3 verwende.
  • Muss auch numpy importieren anstatt in Pandas zu bleiben (ich weiß, numpy wird implizit in Pandas importiert ...)

Hier ist eine aktualisierte Version, die diese Probleme behebt:

def percentile(n):
    def percentile_(x):
        return x.quantile(0.5)
    percentile_.__= 'percentile_{:2.0f}'.format(n*100)
    return percentile_
0
Thomas

In Situationen, in denen Sie lediglich eine Teilmenge der describe (in der Regel die am häufigsten benötigten Statistiken) benötigen, können Sie die zurückgegebenen pandas Serien indizieren, ohne zusätzliche Funktionen zu benötigen.

Zum Beispiel muss ich im Allgemeinen nur den 25., den Median, den 75. und den Zählwert darstellen. Dies kann in nur einer Zeile erfolgen:

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

Für die Angabe Ihrer eigenen Perzentile ist die gewählte Antwort eine gute Wahl, für den einfachen Anwendungsfall sind jedoch keine zusätzlichen Funktionen erforderlich.

0
Maksim