根据索引合并 Pandas DataFrame

Manav Narula 2023年1月30日
  1. 使用 merge() 合并索引上的两个 Pandas DataFrame
  2. 使用 join() 来合并索引上的两个 Pandas DataFrame
根据索引合并 Pandas DataFrame

在数据科学和机器学习的世界里,必须熟练掌握组织、维护和清理数据以便进一步分析的操作。合并两个 DataFrames 就是这样一个操作的例子。事实证明,使用 Python 中的 Pandas 库很容易合并两个 DataFrames。

Pandas 为我们提供了两个有用的函数,merge()join() 来合并两个 DataFrames。这两种方法非常相似,但 merge() 被认为更通用、更灵活。它还提供了许多参数来改变最终 DataFrame 的行为。join() 将两个 DataFrame 合并在它们的索引上,而 merge() 允许我们指定可以作为键的列来合并两个 DataFrame。

这两个函数的一个共同参数是 how,它定义了连接的类型。默认情况下,how 参数对于 merge() 来说是 inner,对于 join() 来说是 left,但对于这两个函数来说,它可以被改为 leftrightinnerouter。了解它们之间的区别是很有必要的。

在合并两个 Pandas DataFrames 时,我们假设一个是左 DataFrame,另一个是右 DataFrame。merge()join() 都是对关键列的记录进行匹配。inner 连接返回一个由两个 DataFrame 中匹配的记录组成的 DataFrame。outer 连接产生一个合并的 DataFrame,包含两个 DataFrame 中的所有元素,填充两边缺失值的 NaN。left 连接包含左边 DataFrame 的所有元素,但只包含右边 DataFrame 的匹配记录。与 left 相反的是 right,它包含右 DataFrame 的所有元素,只包含左 DataFrame 的匹配记录。所有这些都将在接下来的示例代码中更加清晰,我们将在下面的代码中组合 DataFrame。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

print(df1)
print(df2)

输出:

  C1
1  a
2  b
4  d
5  e
7  h
   C2
1  AA
2  BB
3  CC
5  EE
6  FF

使用 merge() 合并索引上的两个 Pandas DataFrame

当合并两个 DataFrames 的索引时,merge() 函数的 left_indexright_index 参数的值应该是 True。下面的代码示例将合并两个 DataFrames,加入类型为 inner

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_inner = df1.merge(df2, how="inner", left_index=True, right_index=True)

print(df_inner)

输出:

  C1  C2
1  a  AA
2  b  BB
5  e  EE

下面的代码将合并连接类型为 outer 的 DataFrames。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_outer = df1.merge(df2, how="outer", left_index=True, right_index=True)

print(df_outer)

输出:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

正如你所看到的,合并后的 DataFrame 的连接类型为 inner,只有来自两个 DataFrame 的匹配记录,而连接类型为 outer 的 DataFrame 拥有所有的元素,用 NaN 来填充缺失的记录。现在使用左连接。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_left = df1.merge(df2, how="left", left_index=True, right_index=True)

print(df_left)

输出:

  C1   C2
1  a   AA
2  b   BB
4  d  NaN
5  e   EE
7  h  NaN

上述合并后的 DataFrame 拥有左侧 DataFrame 中的所有元素,只有右边 DataFrame 中的匹配记录。与之完全相反的是右连接,如下图所示。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_right = df1.merge(df2, how="right", left_index=True, right_index=True)

print(df_right)

输出:

    C1  C2
1    a  AA
2    b  BB
3  NaN  CC
5    e  EE
6  NaN  FF

使用 join() 来合并索引上的两个 Pandas DataFrame

join() 方法根据两个 DataFrame 的索引将其合并,默认情况下,连接类型是 left。它总是使用右侧 DataFrame 的索引,但我们可以为左侧 DataFrame 提键。我们可以为 join() 函数指定连接类型,就像我们为 merge() 函数指定的一样。

下面的例子显示了合并后的 DataFrame 的 outer 连接类型。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)
df_outer = df1.join(df2, how="outer")
print(df_outer)

输出:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN
作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相关文章 - Pandas DataFrame