pandas dataframe merge使用方法
pandas
是一个强大的数据处理库,它提供了大量的功能,可以帮助我们处理各种各样的数据。其中,merge
是 pandas
中的一个重要功能,它可以帮助我们将两个或多个 DataFrame
合并成一个。在这篇文章中,我们将详细介绍 pandas dataframe merge
的使用方法。
1. 基本概念
在开始之前,我们首先需要了解一些基本概念。在 pandas
中,DataFrame
是一个二维的表格型数据结构,可以包含不同类型的列。merge
是 pandas
中的一个函数,它可以根据一个或多个键将两个 DataFrame
的行连接起来。
下面是一个简单的示例:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
df2 = pd.DataFrame({'C': ['C0', 'C1'],
'D': ['D0', 'D1']},
index=['K0', 'K1'])
result = pd.merge(df1, df2, left_on='key', right_index=True)
print(result)
Output:
在这个示例中,我们首先创建了两个 DataFrame
,然后使用 merge
函数将它们合并。left_on='key'
表示我们使用 df1
的 ‘key’ 列作为键,right_index=True
表示我们使用 df2
的索引作为键。
2. 合并方式
pandas
提供了四种合并方式:’inner’、’outer’、’left’ 和 ‘right’。默认情况下,merge
使用 ‘inner’ 方式,也就是只保留两个 DataFrame
中键相同的行。
下面是一个 ‘inner’ 合并的示例:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=['K0', 'K1', 'K2', 'K3'])
result = pd.merge(df1, df2, left_on='key', right_index=True, how='inner')
print(result)
Output:
在这个示例中,我们使用 ‘inner’ 方式合并 df1
和 df2
,结果只包含 ‘K0’ 和 ‘K1’ 这两个键的行,因为只有这两个键在 df1
和 df2
中都存在。
‘outer’ 合并方式会保留两个 DataFrame
中所有的键,如果某个键在一个 DataFrame
中存在,但在另一个 DataFrame
中不存在,那么结果中这个键的行,不存在的部分会被填充为 NaN
。
下面是一个 ‘outer’ 合并的示例:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=['K0', 'K1', 'K2', 'K3'])
result = pd.merge(df1, df2, left_on='key', right_index=True, how='outer')
print(result)
Output:
在这个示例中,我们使用 ‘outer’ 方式合并 df1
和 df2
,结果包含 ‘K0’、’K1’、’K2’ 和 ‘K3′ 这四个键的行,’K2’ 和 ‘K3’ 在 df1
中不存在,所以结果中这两个键的行,df1
的部分被填充为 NaN
。
‘left’ 合并方式会保留左边 DataFrame
中所有的键,如果某个键在左边 DataFrame
中存在,但在右边 DataFrame
中不存在,那么结果中这个键的行,右边 DataFrame
的部分会被填充为 NaN
。
下面是一个 ‘left’ 合并的示例:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=['K0', 'K1', 'K2', 'K3'])
result = pd.merge(df1, df2, left_on='key', right_index=True, how='left')
print(result)
Output:
在这个示例中,我们使用 ‘left’ 方式合并 df1
和 df2
,结果包含 ‘K0’ 和 ‘K1’ 这两个键的行,因为只有这两个键在 df1
中存在。
‘right’ 合并方式会保留右边 DataFrame
中所有的键,如果某个键在右边 DataFrame
中存在,但在左边 DataFrame
中不存在,那么结果中这个键的行,左边 DataFrame
的部分会被填充为 NaN
。
下面是一个 ‘right’ 合并的示例:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=['K0', 'K1', 'K2', 'K3'])
result = pd.merge(df1, df2, left_on='key', right_index=True, how='right')
print(result)
Output:
在这个示例中,我们使用 ‘right’ 方式合并 df1
和 df2
,结果包含 ‘K0’、’K1’、’K2’ 和 ‘K3′ 这四个键的行,’K2’ 和 ‘K3’ 在 df1
中不存在,所以结果中这两个键的行,df1
的部分被填充为 NaN
。
3. 多键合并
merge
函数也支持多键合并。我们可以使用一个列表来指定多个键,merge
函数会根据这些键的组合来合并 DataFrame
。
下面是一个多键合并的示例:
import pandas as pd
df1 = pd.DataFrame({
'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
result = pd.merge(df1, df2, on=['key1', 'key2'])
print(result)
Output:
在这个示例中,我们使用了两个键 ‘key1’ 和 ‘key2’ 来合并 df1
和 df2
。结果中只包含那些在两个 DataFrame
中 ‘key1’ 和 ‘key2’ 的组合都存在的行。
4. 合并时的索引处理
在使用 merge
函数时,我们可以选择是否保留原始的索引。如果我们想保留原始的索引,可以设置 merge
函数的 left_index
或 right_index
参数为 True
。
下面是一个保留索引的示例:
import pandas as pd
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
}, index=['K0', 'K1', 'K2', 'K3'])
df2 = pd.DataFrame({
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
}, index=['K0', 'K2', 'K3', 'K4'])
result = pd.merge(df1, df2, left_index=True, right_index=True, how='outer')
print(result)
Output:
在这个示例中,我们设置了 left_index=True
和 right_index=True
,这表示我们使用 df1
和 df2
的索引作为合并的键。结果中包含了所有在 df1
或 df2
中出现的索引。
5. 使用 suffixes
参数处理重名列
当两个 DataFrame
中存在重名列时,merge
函数会自动为这些列添加后缀以区分它们。我们也可以通过设置 suffixes
参数来自定义这些后缀。
下面是一个处理重名列的示例:
import pandas as pd
df1 = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
result = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
print(result)
Output:
在这个示例中,我们设置了 suffixes=('_left', '_right')
,这表示在合并后的 DataFrame
中,来自 df1
的 ‘A’ 列将被重命名为 ‘A_left’,而来自 df2
的 ‘A’ 列将被重命名为 ‘A_right’。
6. 总结
在这篇文章中,我们详细介绍了 pandas
的 merge
函数的使用方法,包括基本的合并方式、多键合并、索引处理以及如何处理重名列。通过这些知识,你可以更灵活地处理和分析数据。