Python如何合并两个CSV文件

时间:2018-10-23 08:15:47

标签: python python-3.x pandas csv merge

我正在尝试将两个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。但是相反,我让下一个合并的字段为空

---实际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 :(得分:1)

只需将'属性更改为how

outer

left 从左框架开始仅使用result = a.merge(b, on=" Key", how = "outer") ,类似于SQL左外部联接;保留键顺序

答案 1 :(得分:1)

由于键不正确,合并的数据为空。根据您的说法,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

答案 2 :(得分:0)

问题是您的关键字段中有空格(_)。在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")

在导入a.csv时,您可以使用skipinitialspace = True,因为空格在前面,如下所示:

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=","))