Контекст: у меня есть файл с ~ 44 миллионами строк. Каждый является индивидуумом с адресом в США, поэтому есть поле «Почтовый индекс». Файл является TXT, с разделителями трубы.

Из-за размера я не могу (по крайней мере на своей машине) использовать Панд для анализа. Итак, основной вопрос, который у меня есть: сколько записей (строк) для каждого отдельного почтового индекса? Я предпринял следующие шаги, но мне интересно, есть ли более быстрый и более питонский способ сделать это (кажется, что есть, я просто не знаю).

Шаг 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

Я получил конечный результат, но мне интересно, есть ли более простой способ. Спасибо всем.

2
acakaliman 21 Дек 2019 в 03:40

2 ответа

Лучший ответ

Создание 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
2
blueteeth 21 Дек 2019 в 01:24

Это просто, используя встроенный класс Counter.

from collections import Counter

with open(filename) as f:
    c = Counter(line.split('|')[8] for line in f)
print(c)
1
Paul Cornelius 21 Дек 2019 в 01:13