2013-07-10 31 views
12

Tôi muốn chuyển hàm n percenty percentile() thông qua hàm agg() của gấu trúc như tôi làm dưới đây với các hàm thống kê khác nhau.Chia phần trăm cho gấu trúc chức năng tăng cường

Ngay bây giờ tôi có một dataframe trông như thế này:

AGGREGATE MY_COLUMN 
A   10 
A   12 
B   5 
B   9 
A   84 
B   22 

Và mã của tôi trông như thế này:

grouped = dataframe.groupby('AGGREGATE') 
column = grouped['MY_COLUMN'] 
column.agg([np.sum, np.mean, np.std, np.median, np.var, np.min, np.max]) 

Đoạn mã trên làm việc, nhưng tôi muốn làm một cái gì đó giống như

column.agg([np.sum, np.mean, np.percentile(50), np.percentile(95)]) 

nghĩa là chỉ định các phần trăm khác nhau để trở về từ mức tăng()

Việc này nên được thực hiện như thế nào?

+2

Đây có lẽ là một khía cạnh mới của gấu trúc nhưng nhìn vào http://stackoverflow.com/questions/19894939/calculate-arbitrary-percentile- on-pandas-groupby. TLDR: df.groupby ('C'). Quantile (.95) –

Trả lời

29

Có lẽ không phải là siêu hiệu quả, nhưng một trong những cách sẽ tạo ra một chức năng bản thân:

def percentile(n): 
    def percentile_(x): 
     return np.percentile(x, n) 
    percentile_.__name__ = 'percentile_%s' % n 
    return percentile_ 

Sau đó, bao gồm này trong agg của bạn:

In [11]: column.agg([np.sum, np.mean, np.std, np.median, 
        np.var, np.min, np.max, percentile(50), percentile(95)]) 
Out[11]: 
      sum  mean  std median   var amin amax percentile_50 percentile_95 
AGGREGATE 
A   106 35.333333 42.158431  12 1777.333333 10 84    12   76.8 
B   36 12.000000 8.888194  9 79.000000  5 22    12   76.8 

Lưu ý chắc chắn đây là cách nó nên được thực hiện mặc dù ...

+0

có vẻ tốt ..... xin thêm vào sách dạy nấu ăn khi bạn có cơ hội – Jeff

+0

điều chắc chắn, sẽ đi qua sách dạy nấu ăn sau này trong tuần và thêm một vài khác. –

+1

thực sự .... có lẽ '' Series.describe'' nên lấy một '' quantiles'' arg? (và loại bỏ '' percentile_width'') có thể lấy danh sách, ví dụ: '' .describe (quantiles [50,95]) ''? – Jeff

3

Cụ thể hơn, nếu bạn chỉ muốn tổng hợp kết quả nhóm gấu trúc của bạn bằng cách sử dụng thứ Hàm phần trăm e, hàm lambda python cung cấp một giải pháp khá gọn gàng. Sử dụng ký pháp của câu hỏi, tổng hợp theo tỷ lệ phần trăm 95, phải là:

dataframe.groupby('AGGREGATE').agg(lambda x: np.percentile(x['COL'], q = 95)) 

Bạn cũng có thể gán hàm này cho biến và sử dụng nó cùng với các hàm tổng hợp khác.

1

Hãy thử điều này cho percentile 50% và 95%:

column.describe(percentiles = [ 0.5, 0.95 ]) 
Các vấn đề liên quan