Сравнение нескольких столбцов двух CSV-файлов и сохранение результатов как совпадающих / не совпадающих в новом CSV-файле - PullRequest
0 голосов
/ 05 ноября 2018

Предположим, у меня есть столбцы в file1.csv как

Customer id    Name 

Q1             Alen
W2             Ricky
E3             Katrina
R4             Anya
T5             Leonardo

и столбцы в file2.csv как

Customer id    Name

Q1             Alen
W2             Harry
E3             Katrina
R4             Anya
T5             Leonard

здесь, как вы можете видеть для идентификатора клиента: W2, соответствующее имя не соответствует. поэтому файл output.csv должен выглядеть следующим образом:

Customer id  Status

Q1           Matching
W2           Not matching
E3           Matching
R4           Matching
T5           Matching

Как я могу получить вышеуказанный вывод, используя python.

P.S. Какой код для сравнения нескольких столбцов, а не только имя столбца?

Мой код

import csv
with open('file1.csv', 'rt', encoding='utf-8') as csvfile1:
    csvfile1_indices = dict((r[1], i) for i, r in enumerate(csv.reader(csvfile1)))

with open('file2.csv', 'rt', encoding='utf-8') as csvfile2:
    with open('output.csv', 'w') as results:    
        reader = csv.reader(csvfile2)
        writer = csv.writer(results)

        writer.writerow(next(reader, []) + ['status'])

        for row in reader:
            index = csvfile1_indices.get(row[1])
            if index is not None:
                message = 'matching'
                writer.writerow(row + [message])

            else:
                 message = 'not matching'
                 writer.writerow(row + [message])

    results.close()

Это работает нормально, но могу ли я написать другим способом, чтобы получить тот же вывод? и какие изменения мне нужно сделать, чтобы сравнить несколько столбцов?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Если вы не возражаете против использования Pandas, вы можете сделать это в 5 строках кода:

import pandas as pd 

# assuming id columns are identical and contain the same values
df1 = pd.read_csv('file1.csv', index_col='Customer_id')
df2 = pd.read_csv('file2.csv', index_col='Customer_id')

df3 = pd.DataFrame(columns=['status'], index=df1.index)
df3['status'] = (df1['Name'] == df2['Name']).replace([True, False], ['Matching', 'Not Matching'])

df3.to_csv('output.csv')

Редактировать: удалено sep = '\t' для использования запятого по умолчанию.

0 голосов
/ 05 ноября 2018

Вы можете merge в нескольких столбцах:

f1
  Customer_id      Name
0          Q1      Alen
1          W2     Ricky
2          E3   Katrina
3          R4      Anya
4          T5  Leonardo

f2
  Customer_id      Name
0          Q1      Alen
1          W2     Harry
2          E3   Katrina
3          R4      Anya
4          T5  Leonardo

m = f1.merge(f2, on=['Customer_id', 'Name'], indicator='Status', how='outer')
  Customer_id      Name      Status
0          Q1      Alen        both
1          W2     Ricky   left_only
2          E3   Katrina        both
3          R4      Anya        both
4          T5  Leonardo        both
5          W2     Harry  right_only

m['Status'] = m['Status'].map({'both': 'Matching', 
                               'left_only': 'Not matching', 
                               'right_only': 'Not matching'})

m.drop_duplicates(subset=['Customer_id', 'Status'])
m.drop(['Name'], axis=1)
  Customer_id        Status
0          Q1      Matching
1          W2  Not matching
2          E3      Matching
3          R4      Matching
4          T5      Matching
0 голосов
/ 05 ноября 2018

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

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