Skip to content

数据连接

数据连接是合并数据的重要方式,Pandas 提供了灵活的连接操作。

基础连接

python
import pandas as pd

df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2'],
    'B': ['B0', 'B1', 'B2']
}, index=[0, 1, 2])

df2 = pd.DataFrame({
    'C': ['C0', 'C1', 'C2'],
    'D': ['D0', 'D1', 'D2']
}, index=[0, 1, 2])

# 按索引连接
df_join = df1.join(df2)
print(df_join)

不同索引的连接

python
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2']
}, index=['K0', 'K1', 'K2'])

df2 = pd.DataFrame({
    'B': ['B0', 'B1', 'B2']
}, index=['K0', 'K2', 'K3'])

# 左连接(默认)
df_join = df1.join(df2)
print(df_join)

# 右连接
df_join = df1.join(df2, how='right')
print(df_join)

# 外连接
df_join = df1.join(df2, how='outer')
print(df_join)

# 内连接
df_join = df1.join(df2, how='inner')
print(df_join)

多表连接

python
df1 = pd.DataFrame({
    'A': ['A0', 'A1']
}, index=[0, 1])

df2 = pd.DataFrame({
    'B': ['B0', 'B1']
}, index=[0, 1])

df3 = pd.DataFrame({
    'C': ['C0', 'C1']
}, index=[0, 1])

# 连接多个表
df_join = df1.join([df2, df3])
print(df_join)

列名冲突处理

python
df1 = pd.DataFrame({
    '值': [1, 2]
}, index=[0, 1])

df2 = pd.DataFrame({
    '值': [3, 4]
}, index=[0, 1])

# 使用lsuffix和rsuffix
df_join = df1.join(df2, lsuffix='_左', rsuffix='_右')
print(df_join)

与merge的区别

python
df1 = pd.DataFrame({
    '键': ['K0', 'K1', 'K2'],
    'A': ['A0', 'A1', 'A2']
})

df2 = pd.DataFrame({
    '键': ['K0', 'K1', 'K2'],
    'B': ['B0', 'B1', 'B2']
})

# join需要设置列为索引
df_join = df1.set_index('键').join(df2.set_index('键'))
print(df_join)

# merge直接指定键
df_merge = pd.merge(df1, df2, on='键')
print(df_merge)

实际应用示例

python
# 员工信息表
employees = pd.DataFrame({
    '员工ID': ['E001', 'E002', 'E003'],
    '姓名': ['张三', '李四', '王五']
}).set_index('员工ID')

# 部门信息表
departments = pd.DataFrame({
    '员工ID': ['E001', 'E002', 'E004'],
    '部门': ['技术', '销售', '市场']
}).set_index('员工ID')

# 工资信息表
salaries = pd.DataFrame({
    '员工ID': ['E001', 'E002', 'E003'],
    '工资': [8000, 6000, 7000]
}).set_index('员工ID')

# 连接多个表
df_result = employees.join([departments, salaries], how='left')
print(df_result)

join操作在处理索引对齐的数据时非常方便,是数据整合的重要工具。