根据索引合并 Pandas DataFrame
在数据科学和机器学习的世界里,必须熟练掌握组织、维护和清理数据以便进一步分析的操作。合并两个 DataFrames 就是这样一个操作的例子。事实证明,使用 Python 中的 Pandas 库很容易合并两个 DataFrames。
Pandas 为我们提供了两个有用的函数,merge() 和 join()
来合并两个 DataFrames。这两种方法非常相似,但 merge()
被认为更通用、更灵活。它还提供了许多参数来改变最终 DataFrame 的行为。join()
将两个 DataFrame 合并在它们的索引上,而 merge()
允许我们指定可以作为键的列来合并两个 DataFrame。
这两个函数的一个共同参数是 how
,它定义了连接的类型。默认情况下,how
参数对于 merge()
来说是 inner
,对于 join()
来说是 left
,但对于这两个函数来说,它可以被改为 left
、right
、inner
和 outer
。了解它们之间的区别是很有必要的。
在合并两个 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_index
和 right_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
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串