python - 在第 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?
解决方案
以下对我有用。
$ 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_col
andCode
作为数字列:
>>> 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
推荐阅读
- c++ - C++ 中的异常是否仅用于提高可读性?
- c++ - std::this_thread::yield 与 Linux 上的 sched_yield 有什么不同吗?
- javascript - 在 NodeJS 中从 MongoDB 获取元素并添加到要处理的列表/数组
- python - Keras Conv2D 解码器
- go - 我想删除句子中的空格
- javascript - 如何格式化 html 输入,使其从 0.00 开始?
- javascript - Axios CORS Vultr S3“无‘访问控制允许来源’”
- oracle - Oracle Apex 日期选择器行为异常
- swift - 如何检测应用程序何时安装并首先启动?
- flutter - Flutter:List.sort()降序中的错误索引删除