学习笔记

pandas中使用merge()合并DataFrame

pandas中的merge()函数主要用于根据一个或多个键将不同的DataFrame合并到一起,类似于SQL中的 JOIN操作

基本语法

pd.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None)

参数说明:

left和right指定两个要合并的DataFrame

how指定合并方式,参数有inner/outer/left/rght

on指定用于连接的列名

left_on/right_on分别指定左右DataFrame用于连接的列名

简单示例:

import pandas as pd

# 创建两个DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value': [4, 5, 6]})

# 使用merge函数合并
result = pd.merge(df1, df2, on='key')

print(result)

以上例子中,使用了内连接inner合并了两个DataFrame,这会只保留两个DataFrame中key列都存在的行(两个DataFrame的指定列标签下,有重复的元素,重复元素所在的行被保留)

how参数

‘inner’内连接只保留两个DataFrame中键列都存在的行

‘outer’外连接会保留两个DataFrame中的所有行,如果某个DataFrame中没有对应的值,则填充NaN

‘left’左连接保留DataFrame(第一个df)的所有行,如果右侧DataFrame没有对应订单值,则填充NaN

‘right’右连接保留右侧DataFrame(第二个df)的所有行,如果左侧DataFrame没有对应的值,则填充NaN

on参数

on参数用来指定根据哪些列来合并两个DataFrame

1.单列合并

这是最简单的情况,两个DataFrame有一个相同名称的列作为合并键

import pandas as pd

df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value2': [4, 5, 6]})

result = pd.merge(df1, df2, on='key')
print(result)

输出

key  value1  value2
0   A       1       4
1   B       2       5

2.多列合并

如果两个DataFrame有多个名称相同的列,可以用列表指定多个合并键

df1 = pd.DataFrame({'key1': ['A', 'B', 'C'], 'key2': [1, 2, 3], 'value1': [100, 200, 300]})
df2 = pd.DataFrame({'key1': ['A', 'B', 'D'], 'key2': [1, 2, 4], 'value2': [400, 500, 600]})

result = pd.merge(df1, df2, on=['key1', 'key2'])
print(result)

输出:

key1  key2  value1  value2
0    A     1     100     400
1    B     2     200     500

3.不同列名合并

如果两个DataFrame的合并键列名不同,就不能直接使用on参数,这时需要left_on和right_on参数

df1 = pd.DataFrame({'key_a': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key_b': ['A', 'B', 'D'], 'value2': [4, 5, 6]})

result = pd.merge(df1, df2, left_on='key_a', right_on='key_b')
print(result)

输出:

key_a  value1 key_b  value2
0     A       1     A       4
1     B       2     B       5

4.索引合并

如果要根据DataFrame的索引进行合并,可以使用left_index=True 和/或 right_index=True

df1 = pd.DataFrame({'value1': [1, 2, 3]}, index=['A', 'B', 'C'])
df2 = pd.DataFrame({'value2': [4, 5, 6]}, index=['A', 'B', 'D'])

result = pd.merge(df1, df2, left_index=True, right_index=True)
print(result)

输出:

value1  value2
A       1       4
B       2       5

5.混合索引和列合并

可以同时使用索引和列作为合并键

df1 = pd.DataFrame({'key': ['X', 'Y', 'Z'], 'value1': [1, 2, 3]}, index=['A', 'B', 'C'])
df2 = pd.DataFrame({'value2': [4, 5, 6]}, index=['A', 'B', 'D'])

result = pd.merge(df1, df2, left_index=True, right_index=True)
print(result)

输出:

key  value1  value2
A   X       1       4
B   Y       2       5

6.没有指定on参数

如果不指定on参数,merge函数会尝试使用两个DataFrame中所有相同的列名作为合并键

df1 = pd.DataFrame({'key1': ['A', 'B', 'C'], 'key2': [1, 2, 3], 'value1': [100, 200, 300]})
df2 = pd.DataFrame({'key1': ['A', 'B', 'D'], 'key2': [1, 2, 4], 'value2': [400, 500, 600]})

result = pd.merge(df1, df2)
print(result)

输出:

key1  key2  value1  value2
0    A     1     100     400
1    B     2     200     500

注意事项

如果没有指定on参数,且两个DataFrame没有相同的列名,merge将会报错

使用on参数时,指定的列必须在两个DataFrame中都存在

当时会用多个列作为合并键时,这些列的组合值必须是唯一的,否则可能会得到意料之外的结果

发表回复