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的主要内容,如果未能解决你的问题,请参考以下文章