Counter 函数的过滤结果

Filtering results of a Counter function

我想寻求帮助来完成我的 python 代码。

我有一个巨大的文本文件,其中包含 3 列:

示例:

(...)
user_123    visit_188   1330796847
user_123    visit_188   1330797173
user_123    visit_189   1330802227
user_123    visit_189   1330802277
user_123    visit_190   1330806287
user_123    visit_190   1330806353
(...)

我编写了一小部分脚本来计算我的文本文件中所有单词的频率:用户名、访问和日期戳

我可以很容易地打印出几个最先出现的单词的数量(目前我已经用数字 10 填充了 'most.common' 定义的值)。

我现在需要做的就是过滤掉我的脚本的精确结果,这样我就可以只显示(而不是整个单词出现列表):

  1. 第一:最常访问的姓名和次数
  2. 第二:在我的文本文件中出现次数最多的用户名是什么

我已经尝试了几件事,但遗憾的是我没有想到 atm。我很乐意接受任何帮助。提前致谢。

我的代码:

import re
from collections import Counter

with open("bigfile.txt", "r") as f:
    data = f.read()

words = re.findall(r'\w+', data)

word_counts = Counter(words).most_common(10)

print(word_counts)

输出:

[('user_819', 27), ('user_356', 25), ('visit_637', 25), ('user_520', 24), ('user_1222', 24), ('user_191', 22), ('user_473', 22), ('user_542', 22), ('user_812', 22), ('visit_1383', 22)]

您需要解析出具体的用户名和访问次数,维护两个个独立的计数器:

import re
from collections import Counter

with open("bigfile.txt", "r") as f:
    data = f.read()
    
visit_counter = Counter()
user_counter = Counter()
rex = re.compile(r'^(\w+)\s+(visit_\d+)')
for line in data.split('\n'):
    m = rex.search(line)
    if m:
        user = m[1]
        visit = m[2]
        user_counter[user] += 1
        visit_counter[visit] += 1
most_common_visits, most_common_visits_number = visit_counter.most_common(1)[0]
print('most common visits:', most_common_visits, 'number:', most_common_visits_number)
print('most common user:', user_counter.most_common(1)[0][0])

因为你有一个“巨大的文本文件”,一个更快的方法是使用 Python Pandas 来避免 Python for 循环(很慢)。

代码

df = pd.read_csv("bigfile.txt", header=None, sep='\s+')  # Read csv into Dataframe
df.columns = ['users', 'visits', 'dates']                # Name columns

# Most frequent user
n = 1                                                    # top n i.e. could be 1, 2, 3, etc.
print(df['users'].value_counts()[:n])                              

# Most frequent visit
print(df['visits'].value_counts()[:n])

例子

文件:bigfile.txt

user_123    visit_188   1330796847
user_123    visit_188   1330797173
user_123    visit_189   1330802227
user_123    visit_189   1330802277
user_123    visit_190   1330806287
user_123    visit_190   1330806353
user_123    visit_190   1330806353
user_456    visit_191   1330806354

df['users'].value_counts()[:n] 的结果显示 user_123 发生了 7 次

user_123    7
Name: users, dtype: int64

df['visits'].value_counts()[:n] 的结果显示 visit_190 发生了 3 次

visit_190    3
Name: visits, dtype: int64

没有图书馆也可以。这只是打印顶部(用户,访问)元组。

data = """user_123    visit_188   1330796847
user_123    visit_188   1330797173
user_123    visit_188   1330797173
user_123    visit_188   1330797173
user_123    visit_189   1330802227
user_123    visit_189   1330802277
user_123    visit_190   1330806287
user_123    visit_190   1330806353
"""

c = {}
for line in data.split('\n'):
    idx = tuple(line.split()[:2])
    if idx in c:
        c[idx] += 1
    else:
        c[idx] = 1
ordered = sorted(c.items(), key=lambda x: x[1], reverse=True)
print(ordered[0])