У меня есть 2 файла CSV:

CSV 1 — исходные_имена.csv

Serial,Names
1,James
2,Stephen
3,Ben
4,Harry
5,Jack
6, Peter

CSV 2 — dup_names.csv

Serial,Names
1,James
2,Kate
3,Ben
4,Sara


Желаемый результат — new.csv

Serial,Names,flag
1,0,T
2,Kate,F
3,0,T
4,Sara,F
5,Jack,F
6,Peter,F

Как видите, одни и те же имена в обоих CSV будут обновлены до 0, если имена совпадают с new.csv.

Вот что я пробовал:

import pandas as pd

df1 = pd.read_csv('original_names.csv')
df2 = pd.read_csv('dup_names.csv')

out = df1.merge(df2['names'], how='inner', on = 'names')

# some code

out.to_csv("new.csv", index=False)


Спасибо за ваше время :)

-1
Special Circumstances Agent 26 Янв 2022 в 17:57

2 ответа

Сделайте внешнее соединение, а затем просто добавьте сюда немного логики. Если 2 столбца имен совпадают, поставьте флаг 'T', иначе поставьте 'F'. Затем замените 'names' на 0 на 'T', иначе имя во втором CSV. Если во втором CSV-файле нет имени, заполните его именем из первого CSV-файла.

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'serial':[1,2,3,4,5,6],
                     'names':['James','Stephen','Ben','Harry','Jack','Peter']})

df2 = pd.DataFrame({'serial':[1,2,3,4,],
                     'names':['James','Kate','Ben','Sara']})


out = df1.merge(df2, how='outer', on = ['serial'])

out['flag'] = np.where(out.names_x == out.names_y, 'T', 'F')
out['names'] = np.where(out.flag == 'T', 0, out.names_y)
out['names'] = out['names'].fillna(out.names_x)

out = out[['serial', 'names', 'flag']]
out.to_csv("new.csv", index=False)

Вывод:

print(out)
   serial  names flag
0       1      0    T
1       2   Kate    F
2       3      0    T
3       4   Sara    F
4       5   Jack    F
5       6  Peter    F
0
chitown88 26 Янв 2022 в 18:10

Вы можете использовать:

import pandas as pd
import numpy as np

df1 = pd.read_csv('original_names.csv')
df2 = pd.read_csv('dup_names.csv')

out = df1.merge(df2, how='left', on = 'Serial')

out['Names'] = np.where(out['Names_x'] == out['Names_y'], 
                        0, out['Names_y'])
out['Names'] = out['Names'].fillna(out['Names_x'])
out['flag'] = np.where(out['Names'] == 0, 'T', 'F')
out = out.drop(['Names_x', 'Names_y'], axis=1)

out.to_csv('new.csv', index=False)

Вывод:

   serial  names flag
0       1      0    T
1       2   Kate    F
2       3      0    T
3       4   Sara    F
4       5   Jack    F
5       6  Peter    F
0
Marco_CH 26 Янв 2022 в 18:16