Python如何合并两个csv文件
Posted
技术标签:
【中文标题】Python如何合并两个csv文件【英文标题】:Python how to merge two csv files 【发布时间】:2019-03-27 09:47:07 【问题描述】:我正在尝试将两个 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 的数据?谢谢。
【问题讨论】:
你可以在 csv 模块中使用csv.DictReader()
,阅读python文档
【参考方案1】:
问题是您的关键字段中有空格(_)。在 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=","))
【讨论】:
感谢skipinitialspace=True,但我忘了添加一段代码。我重命名了该列以避免该错误。在代码中,b 中的列被重命名以匹配读取 b 时来自 a 的列。问题不是因为列 我尝试添加 skipinitialspace=True 并且它起作用了,谢谢,但仍然不确定为什么我之前没有工作,因为我已重命名该列以使其与另一个列的名称匹配。 这些值还包含初始 (a.csv) 和尾随 (b.csv) 空格,所以当我尝试它时,首先出现一个关键错误(因为列名中的空格)然后由于值包含空格,键无法匹配 这就解释了。谢谢!【参考方案2】:只需将how
属性更改为outer
。
result = a.merge(b, on=" Key", how = "outer")
left 仅使用左侧框架中的keys
,类似于 SQL 左外连接;保留键顺序
【讨论】:
当使用外部时,我得到了低于 a 的 csv b 的所有数据,而不是将它们组合在一起。 @PSM,是的,因为outer
使用两个框架中的键并集,类似于 SQL 全外连接;按字典顺序对键进行排序
@PSM,您可以使用sort=False
以防止对最终数据进行排序。
使用外部我仍然没有得到与之前描述的相同的 CSV CI,但在 CSV A 下方附加了 CSV B。所以一行 CSV C 仍然看起来像 a0,k0, 而不是 a0,k0, b0,c0【参考方案3】:
由于key不正确,合并后的数据为空。根据您在 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
【讨论】:
忘记在我的代码中添加我重命名该列以避免该错误。在代码中,b 中的列被重命名以匹配 a 中的列以上是关于Python如何合并两个csv文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python Pandas 合并多个 CSV 文件