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

Пример У меня есть эти два CSV, как можно перезаписать значение столбца type в a.csv или заменить, если оно соответствует строки в столбце fruit в a.csv и b.csv

a.csv

fruit,name,type
apple,anna,A
banana,lisa,A
orange,red,A
pine,tin,A

b.csv

fruit,type
banana,B
apple,B

Как вывести это: ИЛИ как перезаписать

fruit,name,type
apple,anna,B
banana,lisa,B
orange,red,A
pine,tin,A

Я пытаюсь это использовать с помощью панд, но я не знаю, что дальше

df1=pd.read_csv("sha1_vsdt.csv",delimiter=",",error_bad_lines=False,engine = 'python',quoting=3)
df2=pd.read_csv("final.csv",delimiter=",",error_bad_lines=False,engine = 'python',quoting=3)

df = pd.merge(df1, df2, on='SHA-1', how='outer')

Ответы [ 4 ]

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

Вы можете выровнять индексы, update, затем reset_index:

# align indices
df1 = pd.read_csv(s1).set_index('fruit')
df2 = pd.read_csv(s2).set_index('fruit')

# update
df1.update(df2)

# reset index
res = df1.reset_index()

print(res)

    fruit  name type
0   apple  anna    B
1  banana  lisa    B
2  orange   red    A
3    pine   tin    A

Настройка

from io import StringIO

s1 = StringIO("""fruit,name,type
apple,anna,A
banana,lisa,A
orange,red,A
pine,tin,A""")

s2 = StringIO("""fruit,type
banana,B
apple,B""")
0 голосов
/ 23 октября 2018

Используйте map с помощью Series, созданного с помощью set_index, а затем переписывайте отсутствующие несопоставленные значения с исходными значениями столбца на fillna:

#if possible duplicated fruit column
s = df2.drop_duplicates('fruit').set_index('fruit')['type']
df1['type'] = df1['fruit'].map(s).fillna(df1['type'])
print (df1)
    fruit  name type
0   apple  anna    B
1  banana  lisa    B
2  orange   red    A
3    pine   tin    A
0 голосов
/ 23 октября 2018

Вам не нужно merge, это можно реализовать с помощью простого .loc:

df2.set_index('fruit', inplace=True)
mask = df1.fruit.isin(df2.index)
df1.loc[mask, 'type'] = df2.loc[df1.loc[mask, 'fruit'], 'type'].values


    fruit   name    type
0   apple   anna    B
1   banana  lisa    B
2   orange  red     A
3   pine    tin     A
0 голосов
/ 23 октября 2018

В соответствии с вашим входом вы дали

import pandas as pd
df1=pd.read_csv("a.csv")
df2=pd.read_csv("b.csv")
df = pd.merge(df1, df2, on='fruit', how='outer')
df['type_x'] = df['type_y'].combine_first(df['type_x'])
del df["type_y"]
df = df[pd.notnull(df['name'])]

вход df1

    fruit   name    type
0   apple   anna    A
1   banana  lisa    A
2   orange  red     A
3   pine    tin     A

вход df2

    fruit   type
0   banana  B
1   lemon   B

выход

   fruit    name    type_x
0   apple   anna    A
1   banana  lisa    B
2   orange  red     A
3   pine    tin     A

если у вас разные файлы с разными именами столбцов

import pandas as pd
df1=pd.read_csv("a.csv")
df2=pd.read_csv("b.csv")
df = pd.merge(df1, df2, on='fruit', how='outer')
df[df.columns[2]] = df[df.columns[3]].combine_first(df[df.columns[2]])
del df[df.columns[3]]
df = df[pd.notnull(df[df.columns[1]])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...