2014-11-02 34 views
7

Tôi có một DataFrame gấu trúc với dữ liệu log:Pandas, groupby và tìm tối đa trong nhóm, giá trị trở lại và đếm

 host service 
0 this.com mail 
1 this.com mail 
2 this.com  web 
3 that.com mail 
4 other.net mail 
5 other.net  web 
6 other.net  web 

Và tôi muốn tìm dịch vụ trên tất cả các máy chủ cung cấp cho các lỗi nhất:

 host service no 
0 this.com mail 2 
1 that.com mail 1 
2 other.net  web 2 

Giải pháp duy nhất tôi tìm thấy được nhóm theo máy chủ và dịch vụ, sau đó lặp lại trên mức 0 của chỉ mục.

Ai đó có thể đề xuất phiên bản ngắn hơn, tốt hơn không? mà không có Iteration?

df = df_logfile.groupby(['host','service']).agg({'service':np.size}) 

df_count = pd.DataFrame() 
df_count['host'] = df_logfile['host'].unique() 
df_count['service'] = np.nan 
df_count['no'] = np.nan 

for h,data in df.groupby(level=0): 
    i = data.idxmax()[0] 
    service = i[1]    
    no = data.xs(i)[0] 
    df_count.loc[df_count['host'] == h, 'service'] = service 
    df_count.loc[(df_count['host'] == h) & (df_count['service'] == service), 'no'] = no 

đầy đủ đang https://gist.github.com/bjelline/d8066de66e305887b714

Trả lời

4

Với df, bước tiếp theo là nhóm bởi giá trị host một mình và
tổng hợp bởi idxmax. Điều này cung cấp cho bạn chỉ mục mà tương ứng với giá trị dịch vụ lớn nhất. Sau đó bạn có thể sử dụng df.loc[...] để chọn các hàng trong df tương ứng với các giá trị dịch vụ lớn nhất:

import numpy as np 
import pandas as pd 

df_logfile = pd.DataFrame({ 
    'host' : ['this.com', 'this.com', 'this.com', 'that.com', 'other.net', 
       'other.net', 'other.net'], 
    'service' : ['mail', 'mail', 'web', 'mail', 'mail', 'web', 'web' ] }) 

df = df_logfile.groupby(['host','service'])['service'].agg({'no':'count'}) 
mask = df.groupby(level=0).agg('idxmax') 
df_count = df.loc[mask['no']] 
df_count = df_count.reset_index() 
print("\nOutput\n{}".format(df_count)) 

mang lại sự DataFrame

 host service no 
0 other.net  web 2 
1 that.com mail 1 
2 this.com mail 2 
+0

Thành ngữ này có thể làm cho một bổ sung tốt đẹp để API groupby: https://github.com/pydata/pandas/issues/8717 – Jeff

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