2014-03-02 6 views
11

Gibt es eine Möglichkeit, eine Liste von Funktionen auf jede Spalte in einem DataFrame wie die Funktion DataFrameGroupBy.agg anzuwenden? Ich fand eine hässliche Art und Weise es so zu tun:Pandas Wie man mehrere Funktionen auf Datenrahmen anwenden

df=pd.DataFrame(dict(one=np.random.uniform(0,10,100), two=np.random.uniform(0,10,100))) 
df.groupby(np.ones(len(df))).agg(['mean','std']) 

     one     two 
     mean  std  mean  std 
1 4.802849 2.729528 5.487576 2.890371 

Antwort

11

Für Pandas 0.20.0 oder neuer verwenden df.agg (Danke für pointing this out Ayhan):

In [11]: df.agg(['mean', 'std']) 
Out[11]: 
      one  two 
mean 5.147471 4.964100 
std 2.971106 2.753578 

Für ältere Versionen, könnten Sie verwenden

In [68]: pd.DataFrame({col: [getattr(df[col], func)() for func in ('mean', 'std')] for col in df}, index=('mean', 'std')) 
Out[68]: 
      one  two 
mean 5.147471 4.964100 
std 2.971106 2.753578 
:

In [61]: df.groupby(lambda idx: 0).agg(['mean','std']) 
Out[61]: 
     one    two   
     mean  std mean  std 
0 5.147471 2.971106 4.9641 2.753578 

wäre eine andere Möglichkeit,

+1

'agg' ist jetzt als ein Datenrahmen Verfahren so funktioniert dies ohne den Trick zu:' df.agg (['gemein', 'std']) '. – ayhan

+0

@ayhan: Vielen Dank für die Verbesserung. – unutbu

5

Im allgemeinen Fall, wo Sie beliebige Funktionen und Spaltennamen haben, können Sie dies tun:

df.apply(lambda r: pd.Series({'mean': r.mean(), 'std': r.std()})).transpose() 

     mean  std 
one 5.366303 2.612738 
two 4.858691 2.986567 
Verwandte Themen