Pandas 基于列合并 csv
Posted
技术标签:
【中文标题】Pandas 基于列合并 csv【英文标题】:Pandas merge csv base on columns 【发布时间】:2017-07-23 20:18:14 【问题描述】:您好,我知道这个问题之前已经回答过了,但是我得到了奇怪的结果这些解决方案。所以希望能解释一下我的方法有什么问题。
我有 2 个 csv 文件
f1
A,B,C
1,2,3
1,2,3
3,3,3
f2
C,D,F
3,3,1
1,1,1
我正在尝试合并它们。 简单
f = pd.merge(left=f1, right=f2, how='outer', on='C')
但是合并结果而不是给出预期的表格
A,B,C,D,F
1,2,3,3,1
1,2,3,3,1
3,3,3,3,1
我得到的结果是:
A,B,C,D,F
1,2,3
1,2,3
3,3,3
,,3,3,1
,,1,1,1
不知道为什么我会得到这个。
我不是在处理这些确切的数据。我从 csv 文件中读取这些数据为
pd.read_csv('filename.csv', usecols=[colnames])
编辑:
这是我的代码:
import pandas as pd
f2 = pd.read_csv('filename1.csv', usecols=[colnames])
f1 = pd.read_csv('filename2.csv', usecols=[colnames])
f = pd.merge(left=f1, right=f2, how='left', on='MergeCol')
【问题讨论】:
【参考方案1】:这是您的解决方案。你想做一个左连接而不是外连接:
import pandas as pd
f1 = pd.DataFrame('A':[1,1,3], 'B':[2,2,3], 'C':[3,3,3])
f2 = pd.DataFrame('C':[3,1], 'D':[3,1], 'F':[1,1])
f = f1.merge(f2, how='left', on='C')
输出:
A B C D F
0 1 2 3 3 1
1 1 2 3 3 1
2 3 3 3 3 1
如果您想写回 csv,只需执行以下操作:
f.to_csv('yourfile.csv', index=False)
【讨论】:
是的,这行得通。我想问题在于我读取 csv 文件的方式,因为当我运行文件代码时,我仍然得到相同的结果。pd.read_csv('filename1.csv', usecols=[colnames])
似乎没有创建正确的数据框。
@RajatVij 嗯...查看您编辑的代码,您正在为您的两个数据框创建传递[colnames]
。这实际上将从两个 CSV 文件中提取相同的列。此外,如果colnames
已经是一个列表,则不需要方括号。此外,如果您通过MergeCol
加入,那么我假设MergeCol
是您的两个数据框中都存在的列名。
是的,我只是为了可读性而写了 colname。我正在传递像['name','date'..]
这样的值。是的 MergeCol 存在于两个具有共同值的 csv 文件中。有多个同名列需要重复,但公共数据在MergeCol中。
叹气,我刚刚检查过,我的 MergeCol 值是 csv 中的整数,因此在其中一个文件中它以 12.0 的形式出现,在另一个文件中以 12 的形式出现
感谢您的帮助,我只是将其转换为字符串并使用它来完成此操作。它正在将 int 转换为 float,因为 column 有一些 NaN 值。稍后会更新帖子。以上是关于Pandas 基于列合并 csv的主要内容,如果未能解决你的问题,请参考以下文章
基于文本字段在 Pandas Dataframes 中合并 CSV 文件