Pandas concat vs merge
在数据分析和数据处理中,经常需要将不同的数据集合并到一起。Pandas 是 Python 中一个强大的数据处理库,它提供了多种数据合并的方法,其中最常用的是 concat()
和 merge()
。这两个函数虽然都用于合并数据,但它们的用途和合并方式有所不同。本文将详细介绍 concat()
和 merge()
的区别、用法以及适用场景,并通过多个示例代码展示如何在实际中使用这两个函数。
1. pandas concat()
concat()
函数主要用于沿着一条轴将多个对象堆叠到一起。可以理解为把两个或多个“表”按行或列的方向拼接。
示例代码 1:基本的行合并
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']
})
df2 = pd.DataFrame({
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 使用concat进行列合并
result = pd.concat([df1, df2], axis=1)
print(result)
Output:
示例代码 3:合并时使用忽略索引
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
})
# 使用concat进行行合并,忽略原有索引,生成新的索引
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']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
})
# 使用concat进行行合并,添加多层索引
result = pd.concat([df1, df2], keys=['x', 'y'])
print(result)
Output:
2. pandas merge()
merge()
函数主要用于根据一个或多个键将不同的DataFrame中的行连接起来。这类似于 SQL 中的 JOIN 操作。
示例代码 5:基于单个键的合并
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:
示例代码 6:多个键的合并
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'key1': ['K0', 'K1', 'K2', 'K3'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'key1': ['K0', 'K1', 'K2', 'K3'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 使用merge进行合并
result = pd.merge(df1, df2, on=['key1', 'key2'])
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'],
'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']
})
# 使用merge进行左连接
result = pd.merge(df1, df2, how='left', on='key')
print(result)
Output:
示例代码 8:右连接
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']
})
df2 = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 使用merge进行右连接
result = pd.merge(df1, df2, how='right', on='key')
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': ['K1', 'K2', 'K3', 'K4'],
'C': ['C1', 'C2', 'C3', 'C4'],
'D': ['D1', 'D2', 'D3', 'D4']
})
# 使用merge进行全外连接
result = pd.merge(df1, df2, how='outer', on='key')
print(result)
Output:
示例代码 10:内连接
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': ['K1', 'K2', 'K3', 'K4'],
'C': ['C1', 'C2', 'C3', 'C4'],
'D': ['D1', 'D2', 'D3', 'D4']
})
# 使用merge进行内连接
result = pd.merge(df1, df2, how='inner', on='key')
print(result)
Output:
示例代码 11:合并时使用不同的列名作为键
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', 'K3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
# 使用merge进行合并,指定不同的列名作为键
result = pd.merge(df1, df2, left_on='key1', right_on='key2')
print(result)
Output:
示例代码 12:使用多个DataFrame进行合并
import pandas as pd
# 创建三个DataFrame
df1 = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'A': ['A0', 'A1', 'A2']
})
df2 = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'B': ['B0', 'B1', 'B2']
})
df3 = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'C': ['C0', 'C1', 'C2']
})
# 首先合并df1和df2
result = pd.merge(df1, df2, on='key')
# 再与df3合并
final_result = pd.merge(result, df3, on='key')
print(final_result)
Output:
示例代码 13:合并时考虑索引
import pandas as pd
# 创建两个DataFrame,其中索引有意义
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', 'K1', 'K2'])
# 使用merge进行合并,考虑索引
result = pd.merge(df1, df2, left_index=True, right_index=True)
print(result)
Output:
示例代码 14:使用suffixes
参数解决列名冲突
import pandas as pd
# 创建两个DataFrame,其中有相同的列名但不是键
df1 = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'A': ['A0', 'A1', 'A2']
})
df2 = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'A': ['B0', 'B1', 'B2']
})
# 使用merge进行合并,解决列名冲突
result = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
print(result)
Output:
示例代码 15:使用indicator
参数显示每行的合并信息
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3']
})
df2 = pd.DataFrame({
'key': ['K1', 'K2', 'K3', 'K4'],
'B': ['B1', 'B2', 'B3', 'B4']
})
# 使用merge进行合并,显示每行的合并信息
result = pd.merge(df1, df2, how='outer', on='key', indicator=True)
print(result)
Output:
这些示例代码展示了如何使用 Pandas 的 concat()
和 merge()
函数进行数据合并。通过这些示例,可以看出 concat()
适用于简单的横向或纵向的数据堆叠,而 merge()
更适用于需要基于一个或多个键进行复杂关系数据合并的场景。在实际应用中,选择合适的方法可以有效地解决数据合并的需求。