Как добавить информацию из одного CSV-файла в другой на основе сопоставленных значений в Python? - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь объединить данные из нескольких файлов CSV в один файл CSV. У меня есть несколько файлов с похожей информацией. Я хочу добавить информацию, которой у меня нет, к одному CSV-файлу, сопоставив аналогичные данные ячейки и добавив отсутствующую информацию в соответствующую строку.

Это изображение файла CSV, к которому я хочу добавить информацию: таблица, которую я хочу добавить к

Это изображение файла CSV, который я хочу проанализировать для получения информации, а затем добавить недостающую информацию в объединенный файл CSV: таблица. Я хочу получить информацию из

Вот как я хочу, чтобы мой CSV-файл выглядел в конце: желаемый результат

Я просто скопировал и вставил сюда, чтобы продемонстрировать свою цель, однако у меня есть тонна данных, которые я хотел бы добавить, сверяя их с моей исходной таблицей.

Моя стратегия до сих пор заключалась в использовании модуля CSV и создании вложенного цикла for, который сравнивается с двумя строками. Прямо сейчас мой код только пытается увидеть, есть ли совпадение между двумя таблицами, не пытаясь добавить что-либо. Это также оказывается трудным.

Мой вывод пока выглядит так: токовый выход ( обратите внимание, что на этом изображении я пытался добавить информацию суперинтенданта, поэтому в выводе вместо имени указывается имя )

Мой код повторяется больше, чем я хотел. Я надеялся, что он просто сравнит значения словаря, к которым я обращался.

#Python 3.6.4    
import csv
import codecs

count = 0
original_csv = codecs.open("Texas School Districts.csv", 'r', encoding='utf-8', errors='ignore')
fieldnames1 = ['NCES LEA ID', 'State ID', 'District Name']
reader1 = csv.DictReader(original, fieldnames=fieldnames1)

additional_info = codecs.open("new_information.csv", 'r', encoding='utf-8', errors='ignore')
fieldnames2 = ['Name', 'District', 'Type', 'Description']
reader2 = csv.DictReader(additional_info, fieldnames=fieldnames2)

for row1 in reader1:
    for row2 in reader2:
        if row1['District Name'] == row2['Name']:
            print(row1['District Name'], ":", row2['Name'])
        else:
            pass
    count += 1  
    original.seek(count)
    append.seek(0)

Что бы вы, ребята, порекомендовали мне сделать, чтобы выполнить задачу объединения новых данных с существующими значениями? Я на правильном пути или ушел далеко? Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, или я могу предоставить дополнительную информацию. Надеюсь, у меня был какой-то смысл. Спасибо всем.

1 Ответ

0 голосов
/ 16 мая 2018

Если вы хотите продолжить делать это на нативном python, а не в pandas или реальной базе данных, у вас есть , чтобы сделать этот код быстрее:

for row1 in reader1:
    for row2 in reader2:
        if row1['District Name'] == row2['Name']:
            print(row1['District Name'], ":", row2['Name'])
        # seek to avoid reader2 to be EOF ...

не нужновторой цикл, если вы предварительно создали поиск set:

existing_names = {row["Name"] for row in reader2}

теперь используйте один цикл, и вам не нужно перематывать файлы:

for row1 in reader1:
    if row1['District Name'] in existing_names: # set lookup is faaast
            print(row1['District Name'])

Теперь код выполняется в O(n)(среднее) против O(n**2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...