2014-10-05 26 views
5

Tôi có một df bình thườngLàm thế nào để sử dụng groupby để áp dụng nhiều chức năng cho nhiều cột trong Pandas?

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]) 

Sau this recipe, tôi nhận được kết quả tôi muốn.

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 

Cách tiếp cận này là tốt, nhưng hãy tưởng tượng bạn phải làm điều này cho một số lượng lớn cột (15-100), sau đó bạn phải nhập tất cả nội dung đó vào công thức, có thể cồng kềnh.

Cho rằng các công thức tương tự được áp dụng cho TẤT CẢ các cột. Có một cách hiệu quả để làm điều này cho một số lượng lớn các cột ?.

Cảm ơn

Trả lời

9

Vì bạn đang tập hợp mỗi cột nhóm lại thành một giá trị, bạn có thể sử dụng agg thay vì apply. The agg method có thể lấy danh sách các hàm làm đầu vào. Các chức năng sẽ được áp dụng cho mỗi cột:

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) 

mang

 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 có ("MultiIndexed") cột thứ bậc. Để chọn một cột nào đó (hoặc cột), bạn có thể sử dụng:

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 

hoặc bạn có thể di chuyển một mức MultiIndex để chỉ số:

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

này là rất rõ ràng. Cảm ơn. – hernanavella

Các vấn đề liên quan