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?
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 ...
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.
Versuchen Sie dies für das 50% und 95% Perzentil:
column.describe( percentiles = [ 0.5, 0.95 ] )
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']})
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.
Ich mag die Lösung, die Andy Hayden gegeben hat , allerdings hatte dies mehrere Probleme für mich:
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_
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.