我正在尝试将两个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中的数据?谢谢。
答案 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=","))