本文目录导读:

- merge() - 类似SQL的Join操作
- join() - 基于索引的连接
- concat() - 纵向或横向拼接
- append() - 追加数据(已弃用,推荐concat)
- 实战案例:员工数据综合分析
- 数据连接后的处理技巧
我来详细介绍Pandas中几种常用的数据连接函数和案例:
merge() - 类似SQL的Join操作
基础连接
import pandas as pd
# 创建示例数据
df1 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'姓名': ['张三', '李四', '王五', '赵六'],
'部门': ['技术部', '市场部', '技术部', '财务部']
})
df2 = pd.DataFrame({
'ID': [1, 2, 3, 5],
'工资': [8000, 9000, 7500, 8500],
'入职日期': ['2021-01-15', '2020-06-01', '2022-03-10', '2021-11-20']
})
# 内连接(默认)
inner_join = pd.merge(df1, df2, on='ID', how='inner')
print("内连接结果:")
print(inner_join)
不同类型的连接
# 左连接
left_join = pd.merge(df1, df2, on='ID', how='left')
print("\n左连接结果:")
print(left_join)
# 右连接
right_join = pd.merge(df1, df2, on='ID', how='right')
print("\n右连接结果:")
print(right_join)
# 外连接(全连接)
outer_join = pd.merge(df1, df2, on='ID', how='outer')
print("\n外连接结果:")
print(outer_join)
多键连接
df3 = pd.DataFrame({
'ID': [1, 2, 3],
'部门': ['技术部', '市场部', '技术部'],
'项目': ['项目A', '项目B', '项目C']
})
df4 = pd.DataFrame({
'ID': [1, 2, 3],
'部门': ['技术部', '市场部', '财务部'],
'预算': [100000, 80000, 120000]
})
# 多键连接
multi_join = pd.merge(df3, df4, on=['ID', '部门'], how='inner')
print("多键连接结果:")
print(multi_join)
join() - 基于索引的连接
# 创建基于索引的数据
df5 = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28]
}, index=['A', 'B', 'C'])
df6 = pd.DataFrame({
'工资': [8000, 9000, 7500],
'城市': ['北京', '上海', '广州']
}, index=['A', 'B', 'D'])
# 默认左连接
join_result = df5.join(df6, how='left')
print("索引左连接:")
print(join_result)
# 添加前缀区分重复列名
df5_renamed = df5.join(df6, how='inner', lsuffix='_左', rsuffix='_右')
print("\n带前缀的连接:")
print(df5_renamed)
concat() - 纵向或横向拼接
# 纵向拼接(追加行)
df7 = pd.DataFrame({
'姓名': ['张三', '李四'],
'年龄': [25, 30]
})
df8 = pd.DataFrame({
'姓名': ['王五', '赵六'],
'年龄': [28, 35]
})
concat_rows = pd.concat([df7, df8], axis=0, ignore_index=True)
print("纵向拼接:")
print(concat_rows)
# 横向拼接(增加列)
df9 = pd.DataFrame({
'工资': [8000, 9000]
})
concat_cols = pd.concat([df7, df9], axis=1)
print("\n横向拼接:")
print(concat_cols)
append() - 追加数据(已弃用,推荐concat)
# 使用concat替代append
df10 = pd.DataFrame({
'姓名': ['钱七'],
'年龄': [32]
})
# 避免使用append,改用concat
result = pd.concat([df7, df10], ignore_index=True)
print("使用concat追加:")
print(result)
实战案例:员工数据综合分析
# 复杂的多表连接案例
# 员工基本信息
employees = pd.DataFrame({
'emp_id': [1001, 1002, 1003, 1004],
'name': ['张三', '李四', '王五', '赵六'],
'dept_id': [1, 2, 1, 3],
'salary': [8000, 9000, 7500, 8500]
})
# 部门信息
departments = pd.DataFrame({
'dept_id': [1, 2, 3, 4],
'dept_name': ['技术部', '市场部', '财务部', '人事部'],
'location': ['北京', '上海', '广州', '深圳']
})
# 项目信息
projects = pd.DataFrame({
'emp_id': [1001, 1002, 1003, 1005],
'project_name': ['项目A', '项目B', '项目C', '项目D'],
'project_budget': [100000, 80000, 120000, 90000]
})
# 链式多表连接
result = (employees
.merge(departments, on='dept_id', how='left') # 添加部门信息
.merge(projects, on='emp_id', how='left') # 添加项目信息
.fillna({'project_name': '无项目', 'project_budget': 0}) # 填充空值
)
print("员工综合分析结果:")
print(result)
数据连接后的处理技巧
# 处理重复列名
df_a = pd.DataFrame({
'key': [1, 2, 3],
'value': ['A', 'B', 'C'],
'col_a': ['x', 'y', 'z']
})
df_b = pd.DataFrame({
'key': [1, 2, 4],
'value': ['D', 'E', 'F'],
'col_b': ['p', 'q', 'r']
})
# 使用suffixes处理重复列名
merged = pd.merge(df_a, df_b, on='key', how='outer',
suffixes=['_表1', '_表2'])
print("处理重复列名:")
print(merged)
# 删除重复列
# 只保留需要的列
merged_clean = merged[['key', 'value_表1', 'col_a', 'col_b']]
print("\n清理后的数据:")
print(merged_clean)
这些就是Pandas中最常用的数据连接函数,通过组合使用这些函数,可以灵活地处理各种数据连接需求,建议根据具体的数据结构和业务需求选择最适合的连接方式。