Как найти повторяющиеся имена в двух больших файлах?

У меня есть два CSV. Один из них — это файл имен. (~1000 строк) Другой представляет собой вкладку, разделенную различной информацией о разных людях, в которой столбец 7 содержит их имена. (~2000000 строк)

Я хочу найти повторяющиеся имена между этими файлами.

На данный момент я ввожу имена из первого файла в список, а затем проверяю строку за строкой в ​​другом файле, чтобы увидеть, соответствует ли имя строки какому-либо в списке. Если это так, я вывожу это как дубликат. Я знаю, что неоптимально читать построчно 2 миллиона строк, поэтому мне интересно, не могли бы вы, ребята, сделать что-то другое.

newList = []
otherList = []

with open('listofnames.csv') as f:
    for line in f:
        newList.append(line)

for x in files:
    with open('%s' % x) as f:
        next(f)
        for line in f:
            y = (((line.strip('\n')).split(','))[7]
            if y in newList:
                print(y)

Он распечатал только одно повторяющееся имя 32 раза.

Я действительно не знаю Python, поэтому не буду создавать ответ, но набор - идеальное решение для такого типа проблем. docs.python.org/2/library/stdtypes.html#set

Christopher Schneider 22.05.2019 16:28

Можете ли вы показать образец файлов csv?

C.Nivs 22.05.2019 16:31
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Чтение большого файла построчно не проблема. Достойные реализации Python (среди них стандартный CPython) обеспечивают буферизацию файлового ввода-вывода, поэтому чтение большими кусками или построчно занимает одинаковое время, потому что внутри доступы разделены на куски.

Что проблематично, так это искать много раз (по одному в строке) слова в довольно большом списке, потому что поиск в списке является последовательным, поэтому у вас будет 1000 сравнений, если имя не найдено, и в среднем 500 сравнений, когда оно есть. Было бы намного эффективнее использовать set, потому что набор хэшируется, что разрешает прямой доступ (O (1) вместо O (n))

Поэтому мой совет - немного изменить ваш код на:

import csv

newlist = set()
otherList = []

with open('listofnames.csv') as f:
    for line in f:
        newList.add(line.strip())

for x in files:
    with open(x) as f:           # no need to format: use directly the filename
        rd = csv.reader(f)       # but rely on a csv.reader to parse a csv file
        next(rd)                 # skip the header line
        for row in rd:
            y = row[7]           # process the right field
            if y in newList:     # searching in a set is fast
                print(y)

Вот это да. Большое спасибо! Набор очень помог, а также использование CSV-ридера. Мне действительно очень помогли.

Soup 24.05.2019 05:53

В дополнение к ответу Сергея рассмотрите возможность использования функции read_csv pandas. Как правило, это быстрее, чем ручной разбор, и избавляет вас от ручных операций зачистки, которые могут привести к ошибкам.

(((line.strip('\n')).split(','))[7]

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

Вот пример кода. Вам просто нужно заменить имя файла и имя столбца вашего большого CSV:

import pandas as pd
names = set(pd.read_csv('listofnames.csv').values)
big_file = pd.read_csv('big_file.csv')
duplicates = set(big_file[big_file['column_name_of_column_7'].isin(names)]['column_name_of_column_7'].values)
Как правило, это быстрее, чем ручной анализ. У вас есть доказательства этого? В моих тестах чтение csv с модулем csv происходит в 4 раза быстрее, чем с pandas. Неудивительно, потому что pandas выполняет гораздо больше работы, которая здесь бесполезна.
Serge Ballesta 22.05.2019 18:22

Я бы не рассматривал возможность использования модуля csv для ручного анализа;). Ручной разбор похож на использование функции line.strip(). Что касается того, что быстрее: модуль csv или pandas, я проведу профилирование и опубликую результаты здесь.

AlexeyGy 22.05.2019 23:31

Если вы можете использовать другой пакет, я предлагаю вам использовать пакет pandas.

Сначала вы открываете свои файлы с помощью _pd.read_csv('ваше_имя_файла'). Во-вторых, используйте функцию объединить().

import pandas as pd 

df1 = pd.read_csv('your_file_name')
df2 = pd.read_csv('your_file_name2')

df1.merge(df2)

Пример:

df1 = pd.DataFrame(data = {'Name': ['name1', 'name2', 'name3', 'name4', 'name5', 'name6']})
df2 = pd.DataFrame(data = {'Name': ['name2', 'name3', 'name4',  'name7', 'name8', 'name9']})

In [1] : df1.merge(df2)
Out[2] :    
Name
-------
0   name2
1   name3
2   name4

Использование фрейма данных помогло! Обнаружил, что простое использование CSV-ридера в скрипте Python творит те же чудеса. Спасибо.

Soup 24.05.2019 05:53

Другие вопросы по теме