Python DataFrame数据合并 merge()、concat()方法(Pandas篇-21)

本文详细介绍了Python pandas库中DataFrame的merge()和concat()方法,包括不同类型的合并方式,如内合并、外合并、左合并、右合并,以及多对一和多对多合并的示例。此外,还讲解了concat()方法在纵向和横向合并的应用,以及如何进行交叉合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python DataFrame数据合并 merge()、concat()方法(Pandas篇-21)
       在这里插入图片描述

🍹博主 侯小啾 感谢您的支持与信赖。☀️
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

✨本博客收录于专栏Python数据分析宝典.。
✨更多精彩内容敬请期待,小啾持续为您输出中!


merge()方法与 concat()方法是 pandas中常用的数据合并方法。
通过对这两个方法的应用,可以实现按照一定更多标准讲多个 DataFrame对象合并为一个 DataFrame对象。


1. merge()方法

1.1 meger语法

merge()方法是pandas库中DataFrame对象的一个方法,用于根据指定的键(key)将两个或多个DataFrame对象合并起来。

语法格式如下:

pd.merge(left, right,how='inner', on="None", left_on="None", right_on="None", left_index=False, right_index=False )

其中,

  • leftright是要合并的两个DataFrame对象。
  • on参数表示要基于哪些列进行合并,可以是单个列名或多个列名的列表。
  • how参数表示合并方式,默认为’inner’,表示取交集。还可以选择’outer’(取并集)、‘left’(以左边DataFrame为准)或’right’(以右边DataFrame为准)。

关于参数的使用,具体可汇总如下:

参数描述
left左表,合并对象,DataFrame或Series
right右表,合并对象,DataFrame或Series
how合并方式,可以是left(左合并), right(右合并), outer(外合并), inner(内合并)
on基准列 的列名
left_on左表基准列列名
right_on右表基准列列名
left_index左列是否以index为基准,默认False,否
right_index右列是否以index为基准,默认False,否

其中,left_indexright_index 不能与 on 同时指定。
merge()方法非常有用,可以将具有相同或相关数据的不同DataFrame对象合并为一个更大、更丰富的DataFrame。它提供了灵活的合并方式,以满足不同合并需求。

下边为大家展示在不同需求场景下的具体用法示例。


1.2 指定参照列-进行合并

指定一个参照列,以该列为准,合并其他列。

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num4': [80, 86, 79]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")
df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

输出效果:
            在这里插入图片描述


1.3 按index合并

也可以通过索引来合并,即以index列为基准。将left_indexright_index两个参数 都设置为True即可。
left_indexright_index 都默认为Falseleft_index表示左表以左表数据的index为基准, right_index表示右表以右表数据的index为基准。)

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num4': [80, 86, 79]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")

df_merge = pd.merge(df1, df2, left_index=True, right_index=True)
print(df_merge)

输出效果:
            在这里插入图片描述
对比两次操作,可以发现,以index列为基准进行合并时,如果两个表中有相同的列名的列,则会在结果中自动给其起新的别名,使其不同。


1.4 how参数:left, right, outer, inner

1.4.1 inner-内合并(默认)

使用来自两个数据集的键的交集

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '004', '003'],
                    'num4': [80, 86, 79]})

print("==================df1=====================")
print(df1)
print("==================df2=====================")
print(df2)
print("=================inner合并================")

# 默认,inner合并
df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

输出效果:
            在这里插入图片描述


1.4.2 outer-外合并

使用来自两个数据集的键的并集

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '004', '003'],
                    'num4': [80, 86, 79]})

print("==================df1=====================")
print(df1)
print("==================df2=====================")
print(df2)
print("=================outer合并================")
df_merge = pd.merge(df1, df2, on='id', how="outer")
print(df_merge)

输出效果:
            在这里插入图片描述


1.4.3 left-左合并

使用来自左数据集的键

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '004', '003'],
                    'num4': [80, 86, 79]})

print("==================df1=====================")
print(df1)
print("==================df2=====================")
print(df2)
print("=================left合并================")
df_merge = pd.merge(df1, df2, on='id', how='left')
print(df_merge)

输出效果:
            在这里插入图片描述
根据结果观察其合并逻辑。


1.4.4 right-右合并

使用来自右数据集的键

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '004', '003'],
                    'num4': [80, 86, 79]})

print("==================df1=====================")
print(df1)
print("==================df2=====================")
print(df2)
print("=================right合并================")
df_merge = pd.merge(df1, df2, on='id', how='right')
print(df_merge)

输出效果:
            在这里插入图片描述


1.5. inner 多对一合并

前边给的示例情况较为理想。如若基准列存在重复值,则合并效果会是如下。
以多对一的合并为例:

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '001', '003'],
                    'num4': [80, 86, 79]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")

输出效果:
            在这里插入图片描述
如图,df2中有重复id1的数据。

合并

df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

合并结果如图所示:
            在这里插入图片描述
依然按照默认的Inner方式,使用来自两个数据集的键的交集。且重复的键的行会在合并结果中体现为多行。


1.6. inner-多对多合并

如图表1和表2中都存在id重复。

import pandas as pd
df1 = pd.DataFrame({'id': ['001', '002', '002', '002', '003'],
                    'num1': [120, 101, 104, 114, 123],
                    'num2': [110, 102, 121, 113, 126],
                    'num3': [105, 120, 113, 124, 128]})
df2 = pd.DataFrame({'id': ['001', '001', '002', '003', '001'],
                    'num4': [80, 86, 79, 88, 93]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")

输出效果:
            在这里插入图片描述


合并:

df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

输出效果:
            在这里插入图片描述


2. concat()方法

2.1 concat() 语法

pd.concat(objs, axis=0, join='outer', ignore_index:bool=False,keys=None,levels=None,names=None, verify_integrity:bool=False,sort:bool=False,copy:bool=True)
参数描述
objsSeries,DataFrame或Panel对象的序列或映射
axis默认为0,表示列。如果为1则表示行。
join默认为"outer",也可以为"inner"
ignore_index默认为False,表示保留索引(不忽略)。设为True则表示忽略索引。
其他重要参数通过实例说明。

2.2. 相同字段的表首位相连

首先准备三组DataFrame数据:

import pandas as pd
df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 114, 123],
                    'num2': [110, 102, 121],
                    'num3': [113, 124, 128]})
df2 = pd.DataFrame({'id': ['004', '005'],
                    'num1': [120, 101],
                    'num2': [113, 126],
                    'num3': [105, 128]})
df3 = pd.DataFrame({'id': ['007', '008', '009'],
                    'num1': [120, 101, 125],
                    'num2': [113, 126, 163],
                    'num3': [105, 128, 114]})


print(df1)
print("=======================================")
print(df2)
print("=======================================")
print(df3)

输出效果:
            在这里插入图片描述
合并

dfs = [df1, df2, df3]
result = pd.concat(dfs)
print(result)

输出效果:
            在这里插入图片描述

如果想要在合并后,标记一下数据都来自于哪张表或者数据的某类别,则也可以给concat加上 参数keys

result = pd.concat(dfs, keys=['table1', 'table2', 'table3'])
print(result)

输出效果:
            在这里插入图片描述
此时,添加的keys与原来的index组成元组,共同成为新的index。体现为多重索引。

print(result.index)

输出效果:
            在这里插入图片描述


2.3. 横向表合并(行对齐)

准备两组DataFrame数据:

import pandas as pd
df1 = pd.DataFrame({'num1': [120, 114, 123],
                    'num2': [110, 102, 121],
                    'num3': [113, 124, 128]}, index=['001', '002', '003'])
df2 = pd.DataFrame({'num3': [117, 120, 101, 126],
                    'num5': [113, 125, 126, 133],
                    'num6': [105, 130, 128, 128]}, index=['002', '003', '004', '005'])

print(df1)
print("=======================================")
print(df2)

输出效果:
            在这里插入图片描述

当axis为默认值0时:

result = pd.concat([df1, df2])
print(result)

输出效果:
            在这里插入图片描述

横向合并需要将axis设置为1

result = pd.concat([df1, df2], axis=1)
print(result)

输出效果:
            在这里插入图片描述


对比以上输出差异。

  • axis=0时,即默认纵向合并时,如果出现重复的行,则会同时体现在结果中
  • axis=1时,即横向合并时,如果出现重复的列,则会同时体现在结果中。

2.4 交叉合并

import pandas as pd
df1 = pd.DataFrame({'num1': [120, 114, 123],
                    'num2': [110, 102, 121],
                    'num3': [113, 124, 128]}, index=['001', '002', '003'])
df2 = pd.DataFrame({'num3': [117, 120, 101, 126],
                    'num5': [113, 125, 126, 133],
                    'num6': [105, 130, 128, 128]}, index=['002', '003', '004', '005'])

print(df1)
print("=======================================")
print(df2)
print("=======================================")
result = pd.concat([df1, df2], axis=1, join='inner')
print(result)

输出效果:
            在这里插入图片描述


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侯小啾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值