2014-07-09 7 views
5

Stellen Sie sich vor, ich habe eine DataFrame mit Spalten, die nur echte Werte enthalten.Groupby angegebenen Perzentilen der Werte der gewählten DataFrame-Spalte

>> df   
      col1 col2  col3 
0  0.907609  82 4.207991 
1  3.743659 1523 6.488842 
2  2.358696 324 5.092592 
3  0.006793  0 0.000000 
4 19.319746 11969 7.405685 

I zu gruppierenden durch Quartile (oder jede andere von mir genannte Perzentile) der ausgewählten Spalte (z.B. col1), einige Operationen an diesen Gruppen durchzuführen. Im Idealfall würde Ich mag, wie etwas zu tun ist:

df.groupy(quartiles_of_col1).mean() # not working, how to code quartiles_of_col1? 

Die Ausgabe sollte den Mittelwert von jedem der Säulen für vier Gruppen gibt den Quartile von col1 entsprechen. Ist das mit dem Befehl groupby möglich? Was ist der einfachste Weg, um es zu erreichen?

Antwort

7

Ich habe keinen Computer testen jetzt gedruckt werden, aber ich glaube, Sie können es tun, indem : df.groupby(pd.cut(df.col0, np.percentile(df.col0, [0, 25, 75, 90, 100]), include_lowest=True)).mean(). Wird nach 150 Minuten aktualisiert.

Einige Erklärungen:

In [42]: 
#use np.percentile to get the bin edges of any percentile you want 
np.percentile(df.col0, [0, 25, 75, 90, 100]) 
Out[42]: 
[0.0067930000000000004, 
0.907609, 
3.7436589999999996, 
13.089311200000001, 
19.319745999999999] 
In [43]: 
#Need to use include_lowest=True 
print df.groupby(pd.cut(df.col0, np.percentile(df.col0, [0, 25, 75, 90, 100]), include_lowest=True)).mean() 
         col0  col1  col2 
col0           
[0.00679, 0.908] 0.457201  41.0 2.103996 
(0.908, 3.744]  3.051177 923.5 5.790717 
(3.744, 13.0893]  NaN  NaN  NaN 
(13.0893, 19.32] 19.319746 11969.0 7.405685 
In [44]: 
#Or the smallest values will be skiped 
print df.groupby(pd.cut(df.col0, np.percentile(df.col0, [0, 25, 75, 90, 100]))).mean() 
         col0  col1  col2 
col0           
(0.00679, 0.908] 0.907609  82.0 4.207991 
(0.908, 3.744]  3.051177 923.5 5.790717 
(3.744, 13.0893]  NaN  NaN  NaN 
(13.0893, 19.32] 19.319746 11969.0 7.405685 
+2

Das funktioniert für mich! Brilliante Verwendung von Schnitt! Danke champ – biobirdman

+1

Beispiel hinzugefügt. Es stellt sich heraus, dass Sie auch "include_lowest" auf "True" setzen möchten, da sonst die kleinsten Zahlen übersprungen werden. Bearbeitet. Prost! –

0

Ich hoffe, dass dies Ihr Problem lösen wird. Es ist nicht schön, aber ich hoffe, es wird für Sie arbeiten

import pandas as pd 
    import random 
    import numpy as np 
    ## create a mock df as example. with column A, B, C and D 
    df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) 

    ## select dataframe based on the quantile of column A, using the quantile method. 
    df[df['A'] < df['A'].quantile(0.3)].mean() 

diese

A -1.157615 
B 0.205529 
C -0.108263 
D 0.346752 
dtype: float64 
+0

Nun, das ist für einen Perzentil ok, aber ich bin speziell gesucht für eine Lösung, die das '' mean'' für jede der durch die Perzentiles/'q'-Quantile definierten Gruppen erhält. – pms

+0

Wie wäre es mit einer for-Schleife, die den Quantilwert ersetzt? – biobirdman

+0

Ja, das ist eine Möglichkeit, aber es ist weder elegant noch effizient. Stellen Sie sich vor, Sie haben einen großen DF und wollen ihn in 10-Kanantile aufteilen. Eine Schleife zu machen würde bedeuten, dass Sie 10 Mal über den DF gehen, nur um Ihre Daten zu gruppieren. – pms

Verwandte Themen