DataFrame.merge 函数是用来合并两个DataFrame的非常强大的工具。这个函数主要用于数据库风格的连接或合并操作。通过修改 how 参数来改变合并的类型(例如 outer, left, right),或者通过设置 left_index=True 或 right_index=True 来使用索引进行合并。 DataFrame.merge 成为在数据分析和数据处理中非常重要的工具。本文主要介绍一下Pandas中pandas.DataFrame.merge方法的使用。

DataFrame.merge(self, 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) → 'DataFrame'     [source]

用数据库样式的联接合并DataFrame或命名的Series对象。

联接在列或索引上完成。如果在列上连接列,则DataFrame索引将被忽略。否则,如果在索引上连接索引或在一个或多个列上建立索引,则将传递索引。

参数:

right : DataFrame或命名的Series

要合并的对象。

how{‘left’, ‘right’, ‘outer’, ‘inner’}, 

默认 ‘inner’

要执行的合并类型。

1) left:仅使用左框架中的键,

类似于SQL左外部联接;保留关键顺序

2) right:仅使用右框架中的键,

类似于SQL右外部联接;保留关键顺序

3) outer:使用两个框架中键的并集,

类似于SQL完全外部联接;按字典顺序排序键

4) inner:使用两个框架中关键点的交集,

类似于SQL内部联接;保留左键的顺序

on:label或list

要加入的列或索引级别名称。

这些必须在两个DataFrame中都可以找到。

如果on为None且未在索引上合并,

则默认为两个DataFrame中列的交集。

left_onlabellist,或类似数组

要在左侧DataFrame中加入的列或索引级别名称。

也可以是左侧DataFrame长度的数组或数组列表。

这些数组被视为列。

right_on:标签或列表,或类似数组

要在右侧DataFrame中加入的列或索引级别名称。

也可以是正确DataFrame长度的数组或数组列表。

这些数组被视为列。

left_index:布尔值,默认为False

使用左侧DataFrame中的索引作为连接键。

如果它是MultiIndex,

则另一个DataFrame中的键数(索引或列数)

必须与级别数匹配

right_index:布尔值,默认为False

使用右侧DataFrame中的索引作为连接键。

与left_index相同的警告

sort:布尔值,默认为False

在结果DataFrame中按字典顺序对联接键进行排序。

如果为False,则联接键的顺序取决于联接类型

(how关键字)

suffixes:2个长度的序列(元组,列表等)

suffixes分别应用于左侧和右侧的重叠列名

copy:布尔值,默认为True

如果为False,请勿不必要地复制数据

indicator:布尔值或字符串,默认为False

如果为True,则在输出DataFrame中添加一列,

称为“_merge”,其中包含有关每一行源的信息。

如果为字符串,则将在每一行的源上带有信息的列,

添加到输出DataFrame中,

并将该列命名为字符串的值。信息列是分类类型的,

对于其合并键仅出现在'left'DataFrame中的观测值,

其值为“left_only”;对于其合并键仅出现在'right'

DataFrame中的观测值,其值为“right_only”

如果两者中都存在观察值的合并键。

validate:字符串,默认为None

如果指定,则检查合并是否为指定的类型。

“one_to_one”“1:1”

检查合并键在左右数据集中是否唯一。

“one_to_many”或“1:m”

检查合并键在左数据集中是否唯一。

“many_to_one”“m:1”

检查合并键在正确的数据集中是否唯一。

“many_to_many”“m:m”

允许,但不进行检查。

0.21.0版中的新功能。

返回值

DataFrame

如果输出类型是DataFrame的子类,

则其输出类型将与“left”相同。

Notes

在版本0.23.0中添加了对将索引级别指定为onleft_onright_on参数的支持,在版本0.24.0中添加了对合并命名系列对象的支持。

例子

1) 内连接(inner join,默认)

只保留两个表中匹配到的部分(交集)。

import pandas as pd

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df2 = pd.DataFrame({
    'id': [1, 2, 4],
    'age': [24, 25, 23]
})

result = df1.merge(df2, on='id', how='inner')
print(result)

2)左连接(left join)

保留左表全部数据,右表匹配上就带上,匹配不上就是 NaN

import pandas as pd

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df2 = pd.DataFrame({
    'id': [1, 2, 4],
    'age': [24, 25, 23]
})

result = df1.merge(df2, on='id', how='left')
print(result)

3)右连接(right join)

import pandas as pd

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df2 = pd.DataFrame({
    'id': [1, 2, 4],
    'age': [24, 25, 23]
})

result = df1.merge(df2, on='id', how='right')
print(result)

4)外连接(outer join)

保留所有数据,不匹配的填 NaN

import pandas as pd

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df2 = pd.DataFrame({
    'id': [1, 2, 4],
    'age': [24, 25, 23]
})

result = df1.merge(df2, on='id', how='outer')
print(result)

5)指定不同的键合并(left_on, right_on)

import pandas as pd

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df3 = pd.DataFrame({
    'user_id': [1, 2, 4],
    'age': [24, 25, 23]
})

result = df1.merge(df3, left_on='id', right_on='user_id', how='inner')
print(result)

6)索引合并

import pandas as pd

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df2 = pd.DataFrame({
    'id': [1, 2, 4],
    'age': [24, 25, 23]
})

df1.set_index('id', inplace=True)
df2.set_index('id', inplace=True)

result = df1.merge(df2, left_index=True, right_index=True, how='inner')
print(result)

推荐文档

相关文档

大家感兴趣的内容

随机列表