2014-10-05 24 views
5

mam normalne dfJak używać Groupby do zastosowania wielu funkcji do wielu kolumn w Pandach?

A = pd.DataFrame([[1, 5, 2], [2, 4, 4], [3, 3, 1], [4, 2, 2], [5, 1, 4]], 
       columns=['A', 'B', 'C'], index=[1, 2, 3, 4, 5]) 

Following this recipe, mam wyniki chciałem.

In [62]: A.groupby((A['A'] > 2)).apply(lambda x: pd.Series(dict(
        up_B=(x.B >= 0).sum(), down_B=(x.B < 0).sum(), mean_B=(x.B).mean(), std_B=(x.B).std(), 
        up_C=(x.C >= 0).sum(), down_C=(x.C < 0).sum(), mean_C=(x.C).mean(), std_C=(x.C).std()))) 

Out[62]: 
     down_B down_C mean_B mean_C  std_B  std_C up_B up_C 
A                  
False  0  0  4.5 3.000000 0.707107 1.414214  2  2 
True  0  0  2.0 2.333333 1.000000 1.527525  3  3 

Podejście to jest w porządku, ale wyobraź sobie, że musiał to zrobić dla dużej liczby kolumn (15-100), następnie trzeba wpisać wszystkie te rzeczy w formule, która może być kłopotliwe.

Biorąc pod uwagę, że te same formuły są stosowane do WSZYSTKICH kolumn. Czy istnieje skuteczny sposób, aby to zrobić dla dużej liczby kolumn ?.

Dzięki

Odpowiedz

9

Ponieważ jesteś agregujące każdy pogrupowane kolumny w jedną wartość, można użyć agg zamiast apply. The agg method może przyjmować listę funkcji jako dane wejściowe. Funkcje będą stosowane do każdej kolumny:

def up(x): 
    return (x >= 0).sum() 
def down(x): 
    return (x < 0).sum() 

result = A.loc[:, 'B':'C'].groupby((A['A'] > 2)).agg(
      [up, down, 'mean', 'std']) 
print(result) 

daje

 B      C       
     up down mean  std up down  mean  std 
A              
False 2 0 4.5 0.707107 2 0 3.000000 1.414214 
True 3 0 2.0 1.000000 3 0 2.333333 1.527525 

result ma hierarchii ("MultiIndexed") kolumny. Aby wybrać określoną kolumnę (lub kolumny), można użyć:

In [39]: result['B','mean'] 
Out[39]: 
A 
False 4.5 
True  2.0 
Name: (B, mean), dtype: float64 

In [46]: result[[('B', 'mean'), ('C', 'mean')]] 
Out[46]: 
     B   C 
     mean  mean 
A     
False 4.5 3.000000 
True 2.0 2.333333 

czy można przenieść jeden poziom MultiIndex do indeksu:

In [40]: result.stack() 
Out[40]: 
        B   C 
A        
False up 2.000000 2.000000 
     down 0.000000 0.000000 
     mean 4.500000 3.000000 
     std 0.707107 1.414214 
True up 3.000000 3.000000 
     down 0.000000 0.000000 
     mean 2.000000 2.333333 
     std 1.000000 1.527525 
+0

To jest bardzo jasne. Dzięki. – hernanavella

Powiązane problemy