【pandas数据合并二】:pd.merge()基于键的合并

目录

一、简介

二、基本用法和参数说明

三、示例代码(两个Dataframe合并)

四、示例代码(多个Dataframe合并)


一、简介

pd.merge() 是 Pandas 库中用于合并数据表的强大函数。它类似于 SQL 中的 JOIN 操作,可以根据一个或多个键将两个或多个 DataFrame 合并在一起。

备注:只能进行纵向拼接。

二、基本用法和参数说明

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
         left_index=False, right_index=False, sort=False,
         suffixes=('_x', '_y'), copy=True, indicator=False,
         validate=None)

参数说明
left: 左侧 DataFrame。
right: 右侧 DataFrame。
how: 合并类型,默认为 'inner'。其他选项包括 'left', 'right', 'outer'。
on: 用于连接的列名。如果未指定,并且没有指定 left_on 和 right_on,则使用 left 和 right 中共同列名的交集。
left_on: 左 DataFrame 中的列或索引级别名称用作键。
right_on: 右 DataFrame 中的列或索引级别名称用作键。
left_index: 如果为 True,则使用左侧 DataFrame 的索引(行标签)作为其合并键。
right_index: 如果为 True,则使用右侧 DataFrame 的索引(行标签)作为其合并键。
sort: 根据合并键对合并后的数据进行排序,默认为 False。
suffixes: 用于追加到重叠列名末尾的字符串元组,默认为 ('_x', '_y')。
copy: 如果为 False,则不复制数据(在可能的情况下),默认为 True。
indicator: 如果为 True,则添加一个特殊列 '_merge' 到输出 DataFrame,表明每行的来源:'left_only', 'right_only', 'both'。
validate: 检查合并键是否在左右 DataFrame 中都存在,以及合并类型是否有效。可选值包括 'one_to_one', 'one_to_many', 'many_to_one', 'many_to_many', 'exact'。

三、示例代码(两个Dataframe合并)

1、外连接(how = 'outer')
外连接保留两个数据集中所有的记录,并且对于没有匹配的部分用 NaN 填充。 

import pandas as pd 

df1 = pd.DataFrame({  
    'Name': ['A', 'B', 'C'],  
    'Age': [25, 30, 35]  
})  
  
df2 = pd.DataFrame({  
    'Name': ['A', 'D', 'C'],  
    'Gender': ['男生', '男生', '女生']  
})  

merged_df_outer = pd.merge(df1, df2, on='Name', how='outer')  
print(merged_df_outer)

# 运行结果
   Name  Age    Gender
0    A  25.0     男生
1    B  30.0    NaN
2    C  35.0     女生
3    D   NaN     男生

2、内连接(how='inner')
内连接只保留两个数据集中键匹配的记录。

mport pandas as pd 

df1 = pd.DataFrame({  
    'Name': ['A', 'B', 'C'],  
    'Age': [25, 30, 35]  
})  
  
df2 = pd.DataFrame({  
    'Name': ['A', 'D', 'C'],  
    'Gender': ['男生', '男生', '女生']  
})  

merged_df_inner = pd.merge(df1, df2, on='Name', how='inner')  
print(merged_df_inner)

# 运行结果
   Name  Age   Gender
0    A   25     男生
1    C   35     女生

3、左连接(how='left')
左连接保留左侧数据集的所有记录,右侧数据集中无匹配的则返回空值。

import pandas as pd 

df1 = pd.DataFrame({  
    'Name': ['A', 'B', 'C'],  
    'Age': [25, 30, 35]  
})  
  
df2 = pd.DataFrame({  
    'Name': ['A', 'D', 'C'],  
    'Gender': ['男生', '男生', '女生']  
}) 

# 返回左侧 DataFrame 的所有行,如果右侧 DataFrame 中没有匹配的行,
# 则结果中右侧 DataFrame 的列填充 NaN。
merged_df_left = pd.merge(df1, df2, on='Name', how='left')  
print(merged_df_left)

# 运行结果
   Name  Age   Gender
0    A   25     男生
1    B   30    NaN
2    C   35     女生

4、右连接(how='right')
右连接与左连接相反,保留右侧数据集的所有记录。

import pandas as pd 

df1 = pd.DataFrame({  
    'Name': ['A', 'B', 'C'],  
    'Age': [25, 30, 35]  
})  
  
df2 = pd.DataFrame({  
    'Name': ['A', 'D', 'C'],  
    'Gender': ['男生', '男生', '女生']  
}) 

# 'right': 右连接,返回右侧 DataFrame 的所有行,如果左侧 DataFrame 中没有匹配的行,则结果中左侧 DataFrame 的列填充 NaN。
merged_df_right = pd.merge(df1, df2, on='Name', how='right')  
print(merged_df_right)

# 运行结果
   Name   Age  Gender
0    A  25.0     男生
1    D   NaN     男生
2    C  35.0     女生

四、示例代码(多个Dataframe合并)

from functools import reduce
import pandas as pd 

df1 = pd.DataFrame({  
    'Name': ['A', 'B', 'C'],  
    'Age': [25, 30, 35]  
})  
df2 = pd.DataFrame({  
    'Name': ['A', 'D', 'C'],  
    'Gender': ['男生', '男生', '女生']  
})  
df3 = pd.DataFrame({  
    'Name': ['A', 'E', 'C'],  
    'province': ['上海', '北京', '湖南']  
})  

dfs = [df1, df2, df3]
result = reduce(lambda left, right: pd.merge(left, right, on='Name', how='outer'), dfs)
print(result)

# 运行结果
   Name  Age  Gender   province
0    A  25.0     男生      上海
1    B  30.0     NaN       NaN
2    C  35.0     女生      湖南
3    D   NaN     男生      NaN
4    E   NaN     NaN      北京

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值