Pandas: 如何将具有不同列的数据框连接起来?

15

我尝试在官方的Pandas文档中找到答案,但发现更加混乱而不是有用。基本上我有两个数据框,它们的列名有重叠但不完全相同:


df1:
   A   B
0  22  34
1  78  42

df2:
   B   C
0  76  29
1  11  67

我希望将它们合并/连接/追加,以便结果为

df3:
   A   B   C
0  22  34  nan
1  78  42  nan
2  nan 76  29
3  nan 11  67

这应该相当简单,但我尝试了几种直觉方法,总是出现错误。有人能帮我吗?

3个回答

15

你需要使用参数how = outer进行合并

df3 = df1.merge(df2, how = 'outer')

    A       B   C
0   22.0    34  NaN
1   78.0    42  NaN
2   NaN     76  29.0
3   NaN     11  67.0

13

如果您只想将数据框连接起来,可以使用以下方法。

pd.concat([df1,df2])

输出:

      A   B     C
0  22.0  34   NaN
1  78.0  42   NaN
0   NaN  76  11.0
1   NaN  11  67.0

然后你可以使用reset_index方法重新创建一个简单的递增索引。

pd.concat([df,df2]).reset_index(drop = True)

输出:

      A   B     C
0  22.0  34   NaN
1  78.0  42   NaN
2   NaN  76  11.0
3   NaN  11  67.0

这个解决方案运行得非常完美,踩票者应该解释一下。 - Vaishali
看起来这确实也可以工作,尽管我认为我已经尝试过了。有人能解释一下与外部合并的区别吗? - gmolau
4
Merge操作类似于SQL的join,它寻找重叠的行并返回每个重叠行的单个行,而outer返回来自两个数据帧(dataframe)的所有记录,但是如果有基于连接条件的重叠行,则会生成一行。 pd.concat仅将两个数据帧堆叠在一起。它没有连接即...不会寻找重叠的行。 - Scott Boston
这个不起作用;它会将列名与实际行保持在一起。 - Snehal

2

@vaishali 和 @scott-boston 的解决方案都可行。由于 merge 函数可以使用 how 参数,因此它更具灵活性。但是如果涉及的列较少,则 concat 可以获得更好的性能。

为了优化 @scott-boston 的答案,您还可以使用内部 concat 参数 igonore_index,它会自动调整索引大小而无需调用另一个函数,代码如下:

pd.concat([df1,df2],ignore_index=True)

输出

      A   B     C
0  22.0  34   NaN
1  78.0  42   NaN
2   NaN  76  11.0
3   NaN  11  67.0

Python(版本3.8.5)| pandas(版本1.1.3)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接