附加多个 Counter() objects 并转换为 Data Frame
Append multiple Counter() objects and convert to Data Frame
我想在多个 .txt 文件中查找保留字列表的词频作为 pandas 数据框。我正在使用 collections.Counter() objects,如果某个词没有出现在文本中,则该词(键)的值在 Counter() 中为零。
理想情况下,结果是一个数据框,其中每一行对应于每个 .txt 文件,列 headers 对应于保留字,第 i 列 j 中的条目对应于 j-th i-th .txt 文件中的单词。
这是我的代码,但问题是 Counter() objects 没有附加,在字典的意义上,每个键(或保留字)都有多个值,而是求和:
for filepath in iglob(os.path.join(folder_path, '*.txt')):
with open(filepath) as file:
cnt = Counter()
tokens = re.findall(r'\w+', file.read().lower())
for word in tokens:
if word in mylist:
cnt[word] += 1
for key in mylist:
if key not in cnt:
cnt[key] = 0
dictionary = defaultdict(list)
for key, value in cnt.items():
dictionary[key].append(value)
print(dictionary)
任何提示将不胜感激!
您需要在循环之前为数据帧创建字典,然后 copy/append 每个文本文件的 Counter
值。
#!/usr/bin/env python3
import os
import re
from collections import Counter
from glob import iglob
def main():
folder_path = '...'
keywords = ['spam', 'ham', 'parrot']
keyword2counts = {keyword: list() for keyword in keywords}
for filename in iglob(os.path.join(folder_path, '*.txt')):
with open(filename) as file:
words = re.findall(r'\w+', file.read().lower())
keyword2count = Counter(word for word in words if word in keywords)
for keyword in keywords:
keyword2counts[keyword].append(keyword2count[keyword])
print(keyword2counts)
if __name__ == '__main__':
main()
测试 list
中的项目是否比 set
中的项目进行相同测试要慢得多。因此,如果这太慢,您可以使用 set
作为 keywords
或额外的一个仅用于测试。
如果列的顺序相关,则在 Python 3.7(或 CPython 3.6)之前添加 collections.OrderedDict
。
我想在多个 .txt 文件中查找保留字列表的词频作为 pandas 数据框。我正在使用 collections.Counter() objects,如果某个词没有出现在文本中,则该词(键)的值在 Counter() 中为零。
理想情况下,结果是一个数据框,其中每一行对应于每个 .txt 文件,列 headers 对应于保留字,第 i 列 j 中的条目对应于 j-th i-th .txt 文件中的单词。
这是我的代码,但问题是 Counter() objects 没有附加,在字典的意义上,每个键(或保留字)都有多个值,而是求和:
for filepath in iglob(os.path.join(folder_path, '*.txt')):
with open(filepath) as file:
cnt = Counter()
tokens = re.findall(r'\w+', file.read().lower())
for word in tokens:
if word in mylist:
cnt[word] += 1
for key in mylist:
if key not in cnt:
cnt[key] = 0
dictionary = defaultdict(list)
for key, value in cnt.items():
dictionary[key].append(value)
print(dictionary)
任何提示将不胜感激!
您需要在循环之前为数据帧创建字典,然后 copy/append 每个文本文件的 Counter
值。
#!/usr/bin/env python3
import os
import re
from collections import Counter
from glob import iglob
def main():
folder_path = '...'
keywords = ['spam', 'ham', 'parrot']
keyword2counts = {keyword: list() for keyword in keywords}
for filename in iglob(os.path.join(folder_path, '*.txt')):
with open(filename) as file:
words = re.findall(r'\w+', file.read().lower())
keyword2count = Counter(word for word in words if word in keywords)
for keyword in keywords:
keyword2counts[keyword].append(keyword2count[keyword])
print(keyword2counts)
if __name__ == '__main__':
main()
测试 list
中的项目是否比 set
中的项目进行相同测试要慢得多。因此,如果这太慢,您可以使用 set
作为 keywords
或额外的一个仅用于测试。
如果列的顺序相关,则在 Python 3.7(或 CPython 3.6)之前添加 collections.OrderedDict
。