【问题标题】:A simpler way to create a dictionary with counts from a 43 million row text file?用 4300 万行文本文件的计数创建字典的更简单方法?
【发布时间】:2020-04-13 09:46:13
【问题描述】:

上下文:我有一个大约 4400 万行的文件。每个人都是有美国地址的人,所以有一个“邮政编码”字段。文件是 txt,以竖线分隔。

由于大小,我不能(至少在我的机器上)使用 Pandas 进行分析。所以我的一个基本问题是:每个不同的邮政编码有多少条记录(行)?我采取了以下步骤,但我想知道是否有更快、更 Pythonic 的方式来执行此操作(似乎有,我只是不知道)。

第 1 步:为文件中的 ZIP 值创建一个集合:

output = set()

with open(filename) as f:
  for line in f:
    output.add(line.split('|')[8]  # 9th item in the split string is "ZIP" value

zip_list = list(output)  # List is length of 45,292

第 2 步:创建一个“0”列表,长度与第一个列表相同:

zero_zip = [0]*len(zip_list)

第 3 步:根据这两个列表创建一个字典(全为零):

zip_dict = dict(zip(zip_list, zero_zip))  

第 4 步:最后我再次浏览了文件,这次更新了我刚刚创建的 dict:

with open(filename) as f:
    next(f)  # skip first line, which contains headers
    for line in f:
        zip_dict[line.split('|')[8]] +=1

我得到了最终结果,但想知道是否有更简单的方法。谢谢大家。

【问题讨论】:

  • 我一直认为,当数据量足够大时,你应该研究一下数据库解决方案,它可以提高内存检索效率
  • 同意,不过这次是对来自数据库团队的输出文件 (*.txt) 进行快速“健全性检查”,因此属于“一次性”类型的情况。

标签: python python-3.x dataset analysis


【解决方案1】:

创建zip_dict 可以替换为defaultdict。如果您可以遍历文件中的每一行,则无需执行两次,只需保持运行计数即可。

from collections import defaultdict

d = defaultdict(int)

with open(filename) as f:
    for line in f:
        parts = line.split('|')
        d[parts[8]] += 1

【讨论】:

  • 谢谢!!!我对收藏模块还不是很熟悉,尽管我确实看过“收藏”创建者的视频演讲。我会探索那些。是的,它是第 9 项,索引 8。
【解决方案2】:

使用内置的 Counter 类很简单。

from collections import Counter

with open(filename) as f:
    c = Counter(line.split('|')[8] for line in f)
print(c)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多