2013-06-18 312 views
2

我有以下格式的apache访问日志文件,我已经使用apache日志解析器导入到熊猫数据框。熊猫dataframe groupby两列

123.231.12.97 - - [10/Jun/2013:06:04:46 -0600] "GET /styles-gadgets.css HTTP/1.0" 200 3036 "http://www.gadgets.lk/" "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0" 

我想通过IP和用户代理进行分组。以下是我的代码。

log_list = [] 

for line in f: 
    data = p.parse(line) 
    data['%t'] = data['%t'][1:12]+' '+data['%t'][13:21]+' '+data['%t'][22:27] 
    log_list.append(data) 

df = pandas.DataFrame(log_list) 

#-------rename data columns in pandas dataframe 
df = df.rename(columns={'%>s': 'Status', '%b':'Bytes Returned', 
         '%h':'IP', '%l':'Username', '%r': 'Request', '%t': 'Time', '%u': 'Userid', '%{Referer}i': 'Referer', '%{User-Agent}i': 'Agent'}) 


test = df.groupby(['IP', 'Agent']) 

此方法是否正确? test = df.groupby(['IP', 'Agent'])。 ?我怎么能打印此(使用打印test.groups给出了一个令人困惑的结果)

我想看到的结果为:

IP   Agent 
123.231.12.97 Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20... 
100.231.12.97 Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20... 
+1

什么是你希望它来打印样? (测试是一个groupby对象,请参阅http://pandas.pydata.org/pandas-docs/stable/groupby.html ...) –

+0

@Andy Hayden:我已经按照我想要看的方式编辑它它。 –

回答

1

我找不到一个直接的方式来知道,也许你可以构建一个新的数据框:

pd.DataFrame(g.groups.keys(), columns=g.keys) 

如果你只是想知道的唯一(IP,代理)对,你可以尝试:

df[['IP', 'Agent']].drop_duplicates() 
+0

谢谢...这工作..1/3我的问题解决了.. :) –

+0

这是好的,如果我想获取06.00和06.05之间的数据?.... fd = pd.DataFrame(df([ IP','Agent'])。between_time('06:00:00','06:05:00')) –

0

是的,你所做的是接近,但我不确定drop_duplicates方法正在做你想做的。 Here's a blog有更多关于分组和查询的想法。

通过组只是重复打印它们:

for group in df.groupby(['IP', 'Agent']): 
    print group