pandas dataframe merge使用方法
Pandas 是一个强大的数据处理库,它提供了一种灵活的数据结构,可以方便地处理各种类型的数据。其中,DataFrame 是 Pandas 提供的一种二维表格型数据结构,非常适合于处理各种类型的数据,包括数值、字符、时间序列等。
在数据处理过程中,经常会遇到需要将两个或多个 DataFrame 进行合并的情况,这时就需要使用到 Pandas 提供的 merge 函数。merge 函数可以根据一个或多个键将不同 DataFrame 中的行连接起来,类似于 SQL 中的 JOIN 操作。
1. 基本用法
Pandas 的 merge 函数的基本语法如下:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
其中,left 和 right 是要合并的两个 DataFrame,how 参数指定了合并的方式,可以是 ‘inner’、’outer’、’left’、’right’,默认为 ‘inner’。on 参数指定了用于连接的列名,必须同时存在于两个 DataFrame 中。left_on 和 right_on 分别指定 left 和 right DataFrame 中用于连接的列。
下面我们通过一个简单的例子来说明 merge 函数的基本用法:
import pandas as pd
# 创建两个 DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key': ['K0', 'K1', 'K2']},
index=['K0', 'K1', 'K2'])
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
'key': ['K0', 'K2', 'K3']},
index=['K0', 'K2', 'K3'])
# 使用 merge 函数合并两个 DataFrame
result = pd.merge(df1, df2, on='key')
print(result)
Output:
2. 合并方式
如前所述,merge 函数的 how 参数可以指定合并的方式,包括 ‘inner’、’outer’、’left’、’right’。下面我们分别介绍这四种合并方式。
2.1 内连接(inner)
内连接是默认的合并方式,它只会保留两个 DataFrame 中键值相同的行。例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key': ['K0', 'K1', 'K2']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
'key': ['K0', 'K2', 'K3']})
result = pd.merge(df1, df2, how='inner', on='key')
print(result)
Output:
2.2 外连接(outer)
外连接会保留两个 DataFrame 中所有的键值,如果某个键在某个 DataFrame 中不存在,那么结果中对应的值会被填充为 NaN。例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key': ['K0', 'K1', 'K2']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
'key': ['K0', 'K2', 'K3']})
result = pd.merge(df1, df2, how='outer', on='key')
print(result)
Output:
2.3 左连接(left)
左连接会保留左侧 DataFrame 中所有的键值,如果某个键在右侧 DataFrame 中不存在,那么结果中对应的值会被填充为 NaN。例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key': ['K0', 'K1', 'K2']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
'key': ['K0', 'K2', 'K3']})
result = pd.merge(df1, df2, how='left', on='key')
print(result)
Output:
2.4 右连接(right)
右连接会保留右侧 DataFrame 中所有的键值,如果某个键在左侧 DataFrame 中不存在,那么结果中对应的值会被填充为 NaN。例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key': ['K0', 'K1', 'K2']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
'key': ['K0', 'K2', 'K3']})
result = pd.merge(df1, df2, how='right', on='key')
print(result)
Output:
3. 多键合并
在实际应用中,我们可能需要根据多个键来合并 DataFrame。这时,我们可以将这些键放在一个列表中,然后传递给 on 参数。例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key1': ['K0', 'K0', 'K1'],
'key2': ['K0', 'K1', 'K0']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
'key1': ['K0', 'K1', 'K1'],
'key2': ['K0', 'K0', 'K0']})
result = pd.merge(df1, df2, on=['key1', 'key2'])
print(result)
Output:
4. 合并后的列名处理
如果两个 DataFrame 中有重名的列,merge 函数会自动在列名后添加后缀以区分它们。默认的后缀是 ‘_x’ 和 ‘_y’,我们也可以通过 suffixes 参数来自定义后缀。例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key': ['K0', 'K1', 'K2']})
df2 = pd.DataFrame({'B': ['B2', 'B3', 'B4'],
'C': ['C0', 'C1', 'C2'],
'key': ['K0', 'K2', 'K3']})
result = pd.merge(df1, df2, on='key', suffixes=('_df1', '_df2'))
print(result)
Output:
5. 使用索引进行合并
除了使用列进行合并,我们还可以使用索引进行合并。这时,我们需要将 left_index 或 right_index(或两者都)设置为 True。例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']},
index=['K0', 'K2', 'K3'])
result = pd.merge(df1, df2, left_index=True, right_index=True)
print(result)
Output:
6. 验证合并
在进行合并操作时,我们可以通过 validate 参数来检查合并是否正确。validate 参数可以接受以下几个值:
- ‘one_to_one’:检查合并是否为一对一合并。
- ‘one_to_many’:检查合并是否为一对多合并。
- ‘many_to_one’:检查合并是否为多对一合并。
- ‘many_to_many’:不进行任何检查。
例如:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'key': ['K0', 'K1', 'K2']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
'key': ['K0', 'K2', 'K3']})
result = pd.merge(df1, df2, on='key', validate='one_to_one')
print(result)
Output: