Pandas:使用正则表达式计算列中多个单词(字符串)的频率

时间:2015-09-23 01:44:12

标签: python pandas

所以我尝试实现这个问题的答案:

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())

任何其他建议(与上述类似)将不胜感激。

1 个答案:

答案 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)