Отметьте несколько условий для одной и той же строки - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно сравнить 2 разных источника и определить все несоответствия для всех IDs

Source_excel таблица

+-----+-------------+------+----------+
| id  | name        | City | flag     |
+-----+-------------+------+----------+
| 101 | Plate       | NY   | Ready    |
| 102 | Back washer | NY   | Sold     |
| 103 | Ring        | MC   | Planning |
| 104 | Glass       | NMC  | Ready    |
| 107 | Cover       | PR   | Ready    |
+-----+-------------+------+----------+

Source_dw таблица

+-----+----------+------+----------+
| id  | name     | City | flag     |
+-----+----------+------+----------+
| 101 | Plate    | NY   | Planning |
| 102 | Nut      | TN   | Expired  |
| 103 | Ring     | MC   | Planning |
| 104 | Top Wire | NY   | Ready    |
| 105 | Bolt     | MC   | Expired  |
+-----+----------+------+----------+

Ожидаемый результат

+-----+-------------+----------+------------+----------+------------+---------+------------------+
| ID  | excel_name  | dw_name  | excel_flag | dw_flag  | excel_city | dw_city | RESULT           |
+-----+-------------+----------+------------+----------+------------+---------+------------------+
| 101 | Plate       | Plate    | Ready      | Planning | NY         | NY      | FLAG_MISMATCH    |
| 102 | Back washer | Nut      | Sold       | Expired  | NY         | TN      | NAME_MISMATCH    |
| 102 | Back washer | Nut      | Sold       | Expired  | NY         | TN      | FLAG_MISMATCH    |
| 102 | Back washer | Nut      | Sold       | Expired  | NY         | TN      | CITY_MISMATCH    |
| 103 | Ring        | Ring     | Planning   | Planning | MC         | MC      | ALL_MATCH        |
| 104 | Glass       | Top Wire | Ready      | Ready    | NMC        | NY      | NAME_MISMATCH    |
| 104 | Glass       | Top Wire | Ready      | Ready    | NMC        | NY      | CITY_MISMATCH    |
| 107 | Cover       |          | Ready      |          | PR         |         | MISSING IN DW    |
| 105 |             | Bolt     |            | Expired  |            | MC      | MISSING IN EXCEL |
+-----+-------------+----------+------------+----------+------------+---------+------------------+

Я новичок в python, и я пробовал запрос ниже, но он не дал ожидаемого результата.

import pandas as pd

source_excel = pd.read_csv('C:/Mypython/Newyork/excel.csv',encoding = "ISO-8859-1")
source_dw = pd.read_csv('C:/Mypython/Newyork/dw.csv',encoding = "ISO-8859-1")
comparison_result = pd.merge(source_excel,source_dw,on='ID',how='outer',indicator=True)

 
comparison_result.loc[(comparison_result['_merge'] == 'both') & (name_x != name_y), 'Result'] = 'NAME_MISMATCH' 
comparison_result.loc[(comparison_result['_merge'] == 'both') & (city_x != city_y), 'Result'] = 'CITY_MISMATCH'
comparison_result.loc[(comparison_result['_merge'] == 'both') & (flag_x != flag_y), 'Result'] = 'FLAG_MISMATCH'     
comparison_result.loc[comparison_result['_merge'] == 'left_only', 'Result'] = 'Missing in dw'  
comparison_result.loc[comparison_result['_merge'] == 'right_only', 'Result'] = 'Missing in excel'  
comparison_result.loc[comparison_result['_merge'] == 'both', 'Result'] = 'ALL_Match' 

csv_column = comparison_result[['ID','name_x','name_y','city_x','city_y','flag_x','flag_y','Result']]
print(csv_column)

Есть ли другой способ Я могу проверить все условия и указать каждое в отдельной строке. Если отдельная строка невозможна, по крайней мере, мне нужен тот же столбец, разделенный всеми несоответствиями. что-то вроде FLAG_MISMATCH,CITY_MISMATCH

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вот способ подсчета очков:

df['result'] = 0

# repeated mask / df.loc statements suggests a loop, over a list of tuples
mask = df['excel_flag'] != df['df_flag']
df.loc[mask, 'result'] += 1

mask = df['excel_name'] != df['dw_name']
df.loc[mask, 'result'] += 10

df['result'] = df['result'].map({ 0: 'all match',
                                  1: 'flag mismatch',
                                 10: 'name mismatch',
                                 11: 'all mismatch',})

1 голос
/ 04 августа 2020

Вы можете сделать:

df = pd.merge(Source_excel, Source_dw, on = 'ID', how = 'left', suffixes = (None, '_dw'))

Это создаст новый фрейм данных, подобный тому, который вы хотите, хотя вам придется изменить порядок столбцов по своему усмотрению. Обратите внимание, что '_ dw' в данном случае является суффиксом, а не префиксом.

Вы можете изменить порядок столбцов по своему усмотрению, используя этот код:

#Complement with the order you want
df = df[['ID', 'excel_name']]

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

#This will return 1 if there's a match and 0 otherwise
df['result_flag'] = df.apply(lambda x: 1 if x.excel_flag == x.flag_dw else 0, axis = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...