所以我尝试实现这个问题的答案:
Count occurrences of certain words in pandas dataframe
但它没有做我想要的。
因此,让我尝试使用数据框输出解释方案:
Date | Log
1 2012-02-02 02:10:01 | GET: /www/file1.php
2 2012-02-02 03:11:04 | GET: /www/img/file5.php
3 ... ... ...
这就是数据框的外观,从第一眼看,你可以告诉它是一个日志文件。
无论如何,这是我使用的正则表达式:\B./[\w./$-]+
(效果很好,不是问题)正则表达式只找到/ file / path,这就是我想要的。
我的目标是获得如下的频率输出:
| /www/file1.php | /etc/gmn/file.css | http/trw/file.js
Date
2012-02-02 02:10:01 | 1 | 0 | 1
2012-02-02 03:11:04 | 0 | 1 | 1
2012-02-05 06:22:04 | 1 | 1 | 1
我的目标是计算每个文件的频率,然后调用这些文件(通过列名或其他选项)。
正如您所知,这样的日志可能有数百个文件,但我需要知道每个文件的出现频率(在日志文件中)。
了解最常调用文件的频率将有助于我确定哪些文件可以放在CDN上(这只是我可以对此类信息执行操作的示例,以防万一有人认为这是毫无意义的 - 虽然我不想要一个不是基于熊猫的解决方案。
我试过的东西不起作用:
df.groupby('Date')['Log'].apply(lambda x: x[x.str.contains(r'\B./[\w./$-]+')].count())
任何其他建议(与上述类似)将不胜感激。
答案 0 :(得分:0)
枢轴的经典案例。首先,让我们引入一个计数列,然后创建一个数据透视表。让我们忽略你的正则表达式,因为那不是问题;只需事先将其应用于该列。
df["Count"] = 1
df.pivot("Date", "Log", "Count").fillna(0)
如果存在具有相同日期和日志的行(可能稍后将对其进行bin,例如只保留日期,而不是时间),则需要先进行分组。
df.groupby(["Date", "Log"], as_index=False).sum().pivot("Date", "Log", "Count").fillna(0)