Pandas concat vs merge

Pandas concat vs merge

参考:pandas concat vs merge

在数据分析和数据处理中,经常需要将不同的数据集合并到一起。PandasPython 中一个强大的数据处理库,它提供了多种数据合并的方法,其中最常用的是 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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:

Pandas concat vs merge

示例代码 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 vs merge

这些示例代码展示了如何使用 Pandas 的 concat()merge() 函数进行数据合并。通过这些示例,可以看出 concat() 适用于简单的横向或纵向的数据堆叠,而 merge() 更适用于需要基于一个或多个键进行复杂关系数据合并的场景。在实际应用中,选择合适的方法可以有效地解决数据合并的需求。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程