2014-10-14 10 views
9

Staram się wymyślić, jak połączyć dwie różne składnie funkcji pandy "dataframe.agg(). Weź tę prostą ramkę danych:Pandy Pythona: przekazywanie wielu funkcji do agg() z argumentami

df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'], 
        'B': [10, 12, 10, 25, 10, 12], 
        'C': [100, 102, 100, 250, 100, 102]}) 

>>> df 
[output] 
     A B C 
0 group1 10 100 
1 group1 12 102 
2 group2 10 100 
3 group2 25 250 
4 group3 10 100 
5 group3 12 102 

Wiem, że można wysłać dwie funkcje agg() i uzyskać nową ramkę danych, gdzie każda funkcja jest stosowana do każdej kolumny:

df.groupby('A').agg([np.mean, np.std]) 

[output] 
      B    C    
     mean  std mean   std 
A           
group1 11.0 1.414214 101 1.414214 
group2 17.5 10.606602 175 106.066017 
group3 11.0 1.414214 101 1.414214 

I wiem, że można przekazać argumenty do pojedynczej funkcji:

df.groupby('A').agg(np.std, ddof=0) 

[output] 
      B C 
A    
group1 1.0 1 
group2 7.5 75 
group3 1.0 1 

Ale czy istnieje sposób przekazywania wielu funkcji wraz z argumentami dla jednego lub obu z nich? Miałem nadzieję, że w dokumentach znajdę coś w rodzaju: df.groupby('A').agg([np.mean, (np.std, ddof=0)]), ale jak na razie brak szczęścia. Jakieś pomysły?

Odpowiedz

13

Cóż, agregat docs w rzeczywistości brakuje. Może istnieć sposób na poradzenie sobie z tym z prawidłowym przekazywaniem argumentów i możesz zajrzeć do kodu źródłowego pandy (może zrobię to później).

Jednakże, można łatwo zrobić:

df.groupby('A').agg([np.mean, lambda x: np.std(x, ddof=0)]) 

I to działa tak samo dobrze.

+0

Sprytnie! Dokładnie tego potrzebuję. – BringMyCakeBack

+6

co z przekazaniem 2 funkcji lambda? Dostaję problem z nagłówkiem. – Dickster

Powiązane problemy