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

Я пытаюсь объединить два csv-файла (a и b) в один (c).CSV-файлы выглядят так:

--- CSV A ---

Field_1, Key
a0     , k0
a1     , k1
a2     , k2
a3     , k0
a4     , k2
a5     , k0

--- CSV B ---

Key, Field_2, Field_3
k0 , b0     , c0
k1 , b1     , c1
k2 , b2     , c2
k3 , b3     , c3

---Ожидаемый CSV C (объединенный csv) ---

Field_1, Key, Field_2, Field_3
a0     , k0 , b0     , c0
a1     , k1 , b1     , c1
a2     , k2 , b2     , c2
a3     , k0 , b0     , c0
a4     , k2 , b2     , c2
a5     , k0 , b0     , c0

Таким образом, в основном поля из csv b, совпадающие с ключом csv a, должны быть объединены для получения csv c.Но вместо этого я получаю следующие слитые поля пустыми

--- Actual CSV C ---

Field_1, Key, Field_2, Field_3
a0     , k0 ,        , 
a1     , k1 ,        , 
a2     , k2 ,        , 
a3     , k0 ,        , 
a4     , k2 ,        , 
a5     , k0 ,        , 

Это код, который я пытаюсь использовать для объединения этих полей.Но, как я сказал, я не могу получить данные из объединенного csv b, я получаю только заголовки.

a = pd.read_csv("a.csv")
b = pd.read_csv("b.csv").rename(columns={'Key': ' Key'})
result = a.merge(b, on=" Key", how="left")
result.to_csv("c.csv", index=False)

Итак, как мне сделать так, чтобы данные из csv b были объединены правильно?Благодаря.

Ответы [ 3 ]

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

Объединенные данные пусты из-за неправильного ключа.В соответствии с вашими ключами данных в b.csv отличается от ключей в a.csv, поскольку он содержит дополнительный пробел.

Ваш код будет работать для этих данных

a.csv

Field_1,Key a0, k0 a1, k1 a2, k2 a3, k0 a4, k2 a5, k0

b.csv

Key, Field_2, Field_3 k0, b0, c0 k1, b1, c1 k2, b2, c2 k3, b3, c3

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

Проблема в том, что в вашем ключевом поле есть пробелы (_).В a.csv у вас есть "_key" (например, " k0"), а в b.csv у вас есть "key " (например, "k0_"), поэтому ключи не совпадают.Если вы удалите пробелы в файле csv, этот код будет работать:

import pandas as pd

a = pd.read_csv("a.csv",sep=",")
b = pd.read_csv("b.csv",sep=",")

pd.merge(a,b,on="Key",how="left")

Вы можете использовать skipinitialspace = True во время импорта для a.csv, так как пробел находится впереди, например:

a = pd.read_csv("a.csv",sep=",",skipinitialspace=True)

или вы определяете функцию, которая удаляет любые пробелы и применяет ее при импорте:

def trim(dataset):

    trim = lambda x: x.strip() if type(x) is str else x #Stripping whitespaces in values

    dataset = dataset.rename(columns=lambda x: x.strip()) #Stripping whitespaces in colnames

    return dataset.applymap(trim)

a = trim(pd.read_csv("a.csv",sep=","))
b = trim(pd.read_csv("b.csv",sep=","))
0 голосов
/ 23 октября 2018

Просто измените свойство how на outer.

result = a.merge(b, on=" Key", how = "outer")

влево используйте только keys из левого фрейма, аналогично левому внешнему соединению SQL;сохранить порядок ключей

...