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 )
其中,
left
和right
是要合并的两个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_index
与right_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_index
和 right_index
两个参数 都设置为True
即可。
(left_index
和 right_index
都默认为False
,left_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)
参数 | 描述 |
---|---|
objs | Series,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)
输出效果: