Pandas数据帧组由两列组成

时间:2013-06-18 09:35:29

标签: group-by pandas dataframe

我有以下格式的apache访问日志文件,我使用apache日志解析器将其导入到pandas数据帧中。

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'])。我怎么打印这个?(使用print 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...

2 个答案:

答案 0 :(得分:1)

我找不到直接知道的方法,也许你可以通过以下方式构建一个新的DataFrame:

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

如果您只想知道唯一(IP,Agent)对,可以尝试:

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

答案 1 :(得分:0)

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

只需遍历各组即可打印出来:

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