обновить город в CSV-файле на основе объединения zip из другого файла - PullRequest
0 голосов
/ 19 октября 2018

У меня есть файл csv file1.csv

Territory   Sales     Zipcode    city   statename
00001000      10         99764    

Другой файл с подробной информацией о городе

Zipcode   city      Statename 
99764     Northway   Alaska

Я хочу обновить file1.csv, как показано ниже

Territory   Sales     Zipcode    city      statename
00001000      10         99764   Northway   Alaska

Это как обычный оператор обновления в SQL

UPDATE file1 SET file1.value = (SELECT table2.CODE
                                  FROM file2 
                                  WHERE table1.value = table2.DESC)

Как я могу сделать это в Python?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Файлы, которые вы указали, не являются должным образом отформатированными файлами DSV, потому что они содержат несколько пробелов.Каждый столбец файла DSV должен быть разделен одним специальным символом (например, ) в вашем примере.

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

file1.csv

Territory,Sales,Zipcode
00001000,10,99764    

file2.csv

Zipcode,city,Statename 
99764,Northway,Alaska

Сценарий, который будет использовать Pandas для записи в file3.csv, будет выглядеть следующим образом:

import pandas as pd

# Load both files via pandas
file1 = pd.read_csv('file1.csv', sep=',')
file2 = pd.read_csv('file2.csv', sep=',')

# Merge results and save them
merge = file1.merge(file2, on='Zipcode')
merge.to_csv('file3.csv', sep=',', index=None)

Вы также можете использовать sep=' ', но я бы советовал против этого, так как ваши файлы DSV повреждены,как указывалось ранее.

0 голосов
/ 19 октября 2018

Если у вас нет доступа или вы не хотите устанавливать pandas, вы можете вместо этого использовать модуль csv.Обратите внимание на использование промежуточного dict d2 для сопоставления почтовых индексов с названиями городов и штатов из file2.csv:

with open('file1.csv') as file1, open('file2.csv') as file2, open('output.csv', 'w') as outfile:
    output = csv.writer(outfile, delimiter=' ')
    d2 = {zip: cols for zip, *cols in csv.reader(file2, delimiter=' ', skipinitialspace=True)}
    for *cols, zip in csv.reader(file1, delimiter=' ', skipinitialspace=True):
        output.writerow([*cols, zip, *d2.get(zip, [])])

с учетом file1.csv следующего содержания:

Territory   Sales     Zipcode    city   statename
00001000      10         99764
00001001      11         99999

Иучитывая file2.csv следующее содержание:

Zipcode   city      Statename
99764     Northway   Alaska
99999     Somewhere  CoolState

output.csv будет иметь следующее содержание:

Territory Sales Zipcode city statename
00001000 10 99764 Northway Alaska
00001001 11 99999 Somewhere CoolState

Также обратите внимание, что, поскольку названия городов и названия штатов могут содержать пробелы, выследует избегать использования пробелов в качестве разделителя и переключения вместо настоящих запятых, в этом случае вы можете удалить параметр delimiter=' ' из вызова csv.writer.

0 голосов
/ 19 октября 2018
import pandas as pd
file1 = pd.read_csv('file1.csv')
file2 = pd.read_csv('file2.csv')
df = pd.merge(file1,file2,how='left', on = 'Zipcode')
df.to_csv('new_file.csv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...