连接两个 Pandas DataFrame 可以使用 merge() 方法, merge() 方法可用于连接两个 DataFrame 的行或列,也可以根据指定的一列或多列进行连接。下面详细讲解如何使用 merge() 连接两个 Pandas DataFrames。
准备工作
首先,导入 Pandas 库,构造两个 DataFrame 并赋值。
import pandas as pd
# 构造第一个 DataFrame
df1 = pd.DataFrame({
'id': [1, 2, 3, 4, 5],
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve']
})
# 构造第二个 DataFrame
df2 = pd.DataFrame({
'id': [1, 2, 3, 5, 6],
'age': [20, 22, 25, 18, 30]
})
生成的 df1 和 df2 分别如下:
id | name | |
---|---|---|
0 | 1 | Alice |
1 | 2 | Bob |
2 | 3 | Charlie |
3 | 4 | David |
4 | 5 | Eve |
id | age | |
---|---|---|
0 | 1 | 20 |
1 | 2 | 22 |
2 | 3 | 25 |
3 | 5 | 18 |
4 | 6 | 30 |
按照指定列连接两个 DataFrame
假如我们按照 “id” 列连接这两个 DataFrame, merge() 方法的使用如下:
# 按照 "id" 列连接两个 DataFrame
df3 = pd.merge(df1, df2, on='id')
# 显示连接结果
print(df3)
输出结果:
id | name | age | |
---|---|---|---|
0 | 1 | Alice | 20 |
1 | 2 | Bob | 22 |
2 | 3 | Charlie | 25 |
3 | 5 | Eve | 18 |
说明:merge() 方法的出入口参数必须是 DataFrame 对象,其中 on 属性指定连接列的名称,列名相同时可以省略 on 属性,merge() 工作方式为“inner”,findAll Column Name匹配时进行连接。
连接方式
merge() 方法有四个参数控制连接方式:how、left_on、right_on、suffixes。
- how:连接方式,取值为 [‘inner’, ‘left’, ‘right’, ‘outer’],默认值为’inner’。
- ‘inner’:内连接,只连接两个 DataFrame 中连接的行。
- ‘left’:左连接,保留左边 DataFrame 的所有行,并将两个 DataFrame 进行连接。
- ‘right’:右连接,保留右边 DataFrame 的所有行,并将两个 DataFrame 进行连接。
-
‘outer’:外连接,保留两个 DataFrame 的所有行,并将它们进行连接。
-
left_on:左边 DataFrame 的连接列名称。
-
right_on:右边 DataFrame 的连接列名称。
-
suffixes:连接列名冲突时使用的后缀,类型为 tuple,并且长度为 2,分别表示左边 DataFrame 和右边 DataFrame 的连接列的后缀。
指定连接方式
假设我们使用外连接,代码如下:
df4 = pd.merge(df1, df2, on='id', how='outer')
# 显示连接结果
print(df4)
输出结果:
id | name | age | |
---|---|---|---|
0 | 1 | Alice | 20 |
1 | 2 | Bob | 22 |
2 | 3 | Charlie | 25 |
3 | 4 | David | NaN |
4 | 5 | Eve | 18 |
5 | 6 | NaN | 30 |
说明:outer 连接返回了两个 DataFrame 的全部行,当存在“缺失”的时候,NaN 填充。
指定连接列名称
同时,上面两个 DataFrame 的连接列名称都是 “id”,如果不一样,要使用 left_on 和 right_on 来指定连接列名称。假设我们现在将 “df2” 中的 “id” 列改成 “person_id”,代码如下:
# 构造第二个 DataFrame
df2_new = pd.DataFrame({
'person_id': [1, 2, 3, 5, 6],
'age': [20, 22, 25, 18, 30]
})
# 按照 'person_id' 列连接两个 DataFrame
df5 = pd.merge(df1, df2_new, left_on='id', right_on='person_id')
# 显示连接结果
print(df5)
输出结果:
id | name | person_id | age | |
---|---|---|---|---|
0 | 1 | Alice | 1 | 20 |
1 | 2 | Bob | 2 | 22 |
2 | 3 | Charlie | 3 | 25 |
3 | 5 | Eve | 5 | 18 |
说明:df1 的 “id” 与 df2_new 的 “person_id” 列进行了连接。
解决列名冲突问题
最后,我们来解决一下连接列名冲突的问题。如果两个 DataFrame 中连接列的名称不一样,那么就会出现列名冲突的情况。最好的解决方法是将两个连接列名称都改成一样的。如果两个连接列名称不同,可以使用 suffixes 属性来指定连接列名冲突时使用的后缀。
# 构造第二个 DataFrame
df2_new2 = pd.DataFrame({
'person_id': [1, 2, 3, 5, 6],
'age': [20, 22, 25, 18, 30]
})
# 按照 'person_id' 列连接两个 DataFrame
df6 = pd.merge(df1, df2_new2, left_on='id', right_on='person_id', suffixes=('_left', '_right'))
# 显示连接结果
print(df6)
输出结果:
id | name | person_id | age_left | age_right | |
---|---|---|---|---|---|
0 | 1 | Alice | 1 | 20 | 20 |
1 | 2 | Bob | 2 | 22 | 22 |
2 | 3 | Charlie | 3 | 25 | 25 |
3 | 5 | Eve | 5 | 18 | 18 |
说明:suffixes 参数指定连接列名冲突时使用的后缀,_left 和 _right 分别指定左边 DataFrame 和右边 DataFrame 的连接列的后缀。
以上就是使用 merge() 方法连接两个 Pandas DataFrame 的完整攻略,通过上面的介绍,各位同学应该可以熟练掌握 merge() 方法的使用了。