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,如何合并多个相同列的csv文件

pandas,如何合并多个相同列的csv文件

基于文本字段在 Pandas Dataframes 中合并 CSV 文件

在 Pandas 中合并列和排序

使用 pandas(和 glob?)合并目录中的大量(csv)数据文本文件

根据特定列合并多个 CSV 文件 - Python