Pandas concat vs merge
在数据分析和数据处理中,经常需要将不同的数据集合并为一个大的数据集。Pandas库提供了多种方式来合并数据,其中最常用的是concat
和merge
。这两种方法虽然都可以用来合并数据,但它们的使用场景和方式有所不同。本文将详细介绍concat
和merge
的区别、用法以及适用场景,并通过多个示例代码来展示如何在实际中使用这两种方法。
pandas concat
concat
函数主要用于沿着一条轴将多个对象堆叠到一起。例如,可以是沿着水平轴将两个DataFrame合并,或者沿着垂直轴将多个Series堆叠成一个DataFrame。
示例代码1:简单的DataFrame合并
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']
}, index=[4, 5, 6, 7])
# 使用concat合并
result = pd.concat([df1, df2])
print(result)
Output:
示例代码2:设置轴向
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']
}, index=[4, 5, 6, 7])
# 沿着列轴合并
result = pd.concat([df1, df2], axis=1)
print(result)
Output:
示例代码3:使用ignore_index参数
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']
}, index=[4, 5, 6, 7])
# 忽略原有索引,创建新的索引
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
示例代码4:使用keys参数创建多级索引
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']
}, index=[4, 5, 6, 7])
# 使用keys创建多级索引
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)
Output:
示例代码5:合并具有不同列的DataFrame
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7']
}, index=[4, 5, 6, 7])
# 合并具有不同列的DataFrame
result = pd.concat([df1, df2], sort=False)
print(result)
Output:
pandas merge
merge
函数主要用于根据一个或多个键将不同的DataFrame的行连接起来。这类似于SQL中的JOIN操作。merge
可以根据一个或多个键的内部、外部或交叉合并。
示例代码6:简单的DataFrame合并
import pandas as pd
# 创建两个DataFrame
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'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 使用merge进行合并
result = pd.merge(df1, df2, on='key')
print(result)
Output:
示例代码7:指定合并方式
import pandas as pd
# 创建两个DataFrame
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', 'K4'],
'C': ['C0', 'C1', 'C2', 'C4'],
'D': ['D0', 'D1', 'D2', 'D4']
})
# 使用左连接
result_left = pd.merge(df1, df2, how='left', on='key')
print(result_left)
# 使用右连接
result_right = pd.merge(df1, df2, how='right', on='key')
print(result_right)
# 使用外连接
result_outer = pd.merge(df1, df2, how='outer', on='key')
print(result_outer)
# 使用内连接
result_inner = pd.merge(df1, df2, how='inner', on='key')
print(result_inner)
Output:
示例代码8:多键合并
import pandas as pd
# 创建两个DataFrame
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:
示例代码9:使用指示器
import pandas as pd
# 创建两个DataFrame
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', 'K4'],
'C': ['C0', 'C1', 'C2', 'C4'],
'D': ['D0', 'D1', 'D2', 'D4']
})
# 使用指示器
result = pd.merge(df1, df2, how='outer', on='key', indicator=True)
print(result)
Output:
示例代码10:合并时使用不同的列名
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'key1': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3']
})
df2 = pd.DataFrame({
'key2': ['K0', 'K1', 'K2', 'K4'],
'B': ['B0', 'B1', 'B2', 'B4']
})
# 使用不同的列名进行合并
result = pd.merge(df1, df2, left_on='key1', right_on='key2')
print(result)
Output:
示例代码11:合并时处理重复列名
import pandas as pd
# 创建两个DataFrame
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': ['A4', 'A5', 'A6', 'A7'],
'C': ['C0', 'C1', 'C2', 'C3']
})
# 处理重复列名
result = pd.merge(df1, df2, on='key', suffixes=('_df1', '_df2'))
print(result)
Output:
示例代码12:使用条件过滤合并结果
import pandas as pd
# 创建两个DataFrame
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', 'K4'],
'C': ['C0', 'C1', 'C2', 'C4'],
'D': ['D0', 'D1', 'D2', 'D4']
})
# 使用条件过滤合并结果
result = pd.merge(df1, df2, on='key')
result = result[result['A'] > 'A1']
print(result)
Output:
以上示例代码展示了concat
和merge
在不同情况下的使用方法。通过这些示例,我们可以看到concat
适用于简单的沿一个轴的合并,而merge
则提供了更为复杂的基于键的合并选项,类似于数据库中的JOIN操作。在实际应用中,选择哪种方法取决于具体的数据结构和需求。