2017-09-28 5 views
0

Ich habe eine kategorische Variable und zwei numerische Spalten:Quantilsgrenzen Schwelle/Filter innerhalb Pandas GROUPBY

np.random.seed(123)  
df = pd.DataFrame({'group' : ['a']*10+['b']*10, 
        'var1' : np.random.randn(20), 
        'var2' : np.random.randint(10,size=20)}) 

möchte ich finden, durch group, der Mittelwert der var1 nach Filterung df zum obersten Quartil verengen var2 Werte nach Gruppe. Das heißt, würde die Schwelle für jede Gruppe:

thresh = df.groupby('group')['var2'].quantile(0.75) 

Hier ist eine loopy Demonstration das, was ich will am Ende mit:

for group, frame in df.groupby('group'): 
    print(frame[frame.var2 >= frame.var2.quantile(0.75)].var1.mean()) 
# -1.4713362407192072 
# 0.15512098976530683 

Das Ergebnis sollte ein Datenrahmen mit (group, var) seinen Spalten oder eine Serie indiziert von group. Ich glaube, die Lösung kann beinhalten .transform/.apply aber bin dort stecken.

+0

Sie wollen einen Datenrahmen der Gruppe var und die calucated Mittelwert oder möchte eine neue Spalte mit diesem Wert transformiert – Dark

+0

@Bharathshetty neues Objekt statt neue Spalte erstellen –

Antwort

1

Ähnlich @ Bharathshetty Antwort aber macht die Funktion ein wenig flexibler, anstatt es zu einem Lambda enthält:

def thresh_filter(obj, sort_var, tgt_var, q=0.75, stat='mean'): 
    thresh = obj[sort_var].quantile(q=q) 
    return getattr(obj[obj[sort_var] >= thresh][tgt_var], stat)() 

print(df.groupby('group').apply(lambda x: thresh_filter(x, 'var2', 'var1'))) 
group 
a -1.47134 
b 0.15512 
dtype: float64 
4

Suchst du das?

new = df.groupby('group').apply(lambda x : \ 
      x[x.var2>=x.var2.quantile(0.75)] \ 
      .var1.mean()).to_frame() 
 
      0 
group   
a  -1.471336 
b  0.155121