首页 > 解决方案 > 在第 1 列的键上合并两个 csv 文件

问题描述

我正在尝试使用外部连接进行合并(组合),以便结果包含第 0 列中具有 id 的行以及两个文件中的所有列。我的文件在第一行包含标题。

我已经尝试了很多变体,但我继续收到抱​​怨密钥的错误。虽然 stackoverflow 中有很多例子,但没有一个给出关于要使用的底层方法的答案。

这些文件的标题带有第一列标题 = '代码',而关键字段实际上是 5 位数字。我不确定这是否给我带来了问题。

df1 = pd.read_csv('file1.csv', header=[0], index_col=['Code'])
df2 = pd.read_csv('file2.csv', header=[0], index_col=['Code'])

我试过了

df1 = pd.read_csv('file1.csv', header=[0])
df2 = pd.read_csv('file2.csv', header=[0])

我尝试过...的变体

dfx = pd.merge(df1, df2, left_on=['Code'], right_on=['Code'], how='outer')
dfx = df1[['Code','A-Score']].merge(df2[['Code','B-Score']], how='outer')
df1.merge(df2, on=['Code'], how='outer')
df  = pd.merge(df1[['Code', 'Field1', 'Field2']], df2['Code', 'Field3', 'Field4'], on='Code', how='outer', suffixes=('-A','-B'))
dfx = pd.concat([df1,df2], axis=1, join='outer')

我希望将两个文件中的所有行合并到一个文件中。两个文件中都没有重复的键。

所以我只想对这两个文件执行一个非常简单的合并,并了解需要哪些参数以及在哪里/为什么。

Postedit:我的问题是键被解释为数字,因为我可以合并字符串键。所以,

我该如何 1. 将键覆盖为字符串而不是数字?2. 如何指定key为int64?

标签: pythonpandasmerge

解决方案


以下对我有用。

$ cat a.csv
Code,Field1,Field2
1,10,100
2,20,200
3,30,300
5,50,500

$ cat b.csv
Code,Field3
1,11
2,21
4,41
>>> df1 = pd.read_csv('a.csv', header=0, index_col='Code')
>>> df1
      Field1  Field2
Code
1         10     100
2         20     200
3         30     300
5         50     500

>>> df2 = pd.read_csv('b.csv', header=0, index_col='Code')
      Field3
Code
1         11
2         21
4         41
>>> df1.merge(df2, how='outer', on='Code')
      Field1  Field2  Field3
Code
1       10.0   100.0    11.0
2       20.0   200.0    21.0
3       30.0   300.0     NaN
5       50.0   500.0     NaN
4        NaN     NaN    41.0

更新:根据@OP 的评论,没有index_colandCode作为数字列:

>>> df1 = pd.read_csv('a.csv', header=[0])
>>> df1
   Code  Field1  Field2
0     1      10     100
1     2      20     200
2     3      30     300
3     5      50     500
>>> df1.dtypes
Code      int64
Field1    int64
Field2    int64
dtype: object

>>> df2 = pd.read_csv('b.csv', header=[0])
>>> df2
   Code  Field3
0     1      11
1     2      21
2     4      41
>>> df2.dtypes
Code      int64
Field3    int64
dtype: object

pd.merge(df1, df2, on='Code', how='outer')
Out[266]:
   Code  Field1  Field2  Field3
0     1    10.0   100.0    11.0
1     2    20.0   200.0    21.0
2     3    30.0   300.0     NaN
3     5    50.0   500.0     NaN
4     4     NaN     NaN    41.0

推荐阅读