Counter 函数的过滤结果
Filtering results of a Counter function
我想寻求帮助来完成我的 python 代码。
我有一个巨大的文本文件,其中包含 3 列:
- 首先有用户名,例如:user_003
- 第二个有访问次数,比如visit_456
- Third 有这些访问的日期戳。
示例:
(...)
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' 定义的值)。
我现在需要做的就是过滤掉我的脚本的精确结果,这样我就可以只显示(而不是整个单词出现列表):
- 第一:最常访问的姓名和次数
- 第二:在我的文本文件中出现次数最多的用户名是什么
我已经尝试了几件事,但遗憾的是我没有想到 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])
我想寻求帮助来完成我的 python 代码。
我有一个巨大的文本文件,其中包含 3 列:
- 首先有用户名,例如:user_003
- 第二个有访问次数,比如visit_456
- Third 有这些访问的日期戳。
示例:
(...)
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' 定义的值)。
我现在需要做的就是过滤掉我的脚本的精确结果,这样我就可以只显示(而不是整个单词出现列表):
- 第一:最常访问的姓名和次数
- 第二:在我的文本文件中出现次数最多的用户名是什么
我已经尝试了几件事,但遗憾的是我没有想到 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])