本文目录导读:
我来为你详细讲解Python数据合并的常见案例,主要使用pandas库。
基础数据准备
import pandas as pd
import numpy as np
# 创建示例数据
df1 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 28]
})
df2 = pd.DataFrame({
'ID': [1, 2, 3, 5],
'Salary': [5000, 6000, 7000, 8000],
'Department': ['IT', 'HR', 'Finance', 'Marketing']
})
print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
merge() 函数 - 数据库风格合并
1 内连接 (inner join)
# 只保留匹配的行
inner_merge = pd.merge(df1, df2, on='ID', how='inner')
print("内连接结果:")
print(inner_merge)
2 左连接 (left join)
# 保留左表所有行
left_merge = pd.merge(df1, df2, on='ID', how='left')
print("左连接结果:")
print(left_merge)
3 右连接 (right join)
# 保留右表所有行
right_merge = pd.merge(df1, df2, on='ID', how='right')
print("右连接结果:")
print(right_merge)
4 外连接 (outer join)
# 保留所有行
outer_merge = pd.merge(df1, df2, on='ID', how='outer')
print("外连接结果:")
print(outer_merge)
多键合并
# 创建多键数据
df3 = pd.DataFrame({
'ID': [1, 2, 3],
'Year': [2020, 2020, 2021],
'Score': [85, 92, 78]
})
df4 = pd.DataFrame({
'ID': [1, 2, 3],
'Year': [2020, 2021, 2021],
'Grade': ['A', 'B', 'A']
})
# 多键合并
multi_key_merge = pd.merge(df3, df4, on=['ID', 'Year'], how='inner')
print("多键合并结果:")
print(multi_key_merge)
concat() 函数 - 轴向连接
1 垂直合并(添加行)
# 创建两个结构相同的DataFrame
df5 = pd.DataFrame({
'Name': ['Eve', 'Frank'],
'Age': [22, 27],
'City': ['New York', 'London']
})
df6 = pd.DataFrame({
'Name': ['Grace', 'Henry'],
'Age': [31, 29],
'City': ['Paris', 'Tokyo']
})
# 垂直合并
vertical_concat = pd.concat([df5, df6], axis=0, ignore_index=True)
print("垂直合并结果:")
print(vertical_concat)
2 水平合并(添加列)
# 创建两个有相同索引的DataFrame
df7 = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]
}, index=[0, 1, 2])
df8 = pd.DataFrame({
'Salary': [5000, 6000, 7000],
'Department': ['IT', 'HR', 'Finance']
}, index=[0, 1, 2])
# 水平合并
horizontal_concat = pd.concat([df7, df8], axis=1)
print("水平合并结果:")
print(horizontal_concat)
join() 方法 - 基于索引合并
# 设置索引并合并
df9 = df1.set_index('ID')
df10 = df2.set_index('ID')
# 使用join方法
join_result = df9.join(df10, how='inner')
print("Join方法结果:")
print(join_result)
实际应用案例
案例1:销售数据分析
# 创建销售数据
orders = pd.DataFrame({
'OrderID': range(1, 6),
'CustomerID': [101, 102, 103, 101, 102],
'Amount': [100, 200, 150, 300, 250],
'Date': pd.date_range('2024-01-01', periods=5)
})
customers = pd.DataFrame({
'CustomerID': [101, 102, 103, 104],
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'City': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']
})
# 合并订单和客户信息
merged_sales = pd.merge(orders, customers, on='CustomerID', how='left')
print("销售数据分析结果:")
print(merged_sales)
# 按客户汇总
sales_summary = merged_sales.groupby('Name').agg({
'Amount': ['sum', 'mean', 'count']
}).round(2)
print("\n客户销售汇总:")
print(sales_summary)
案例2:多表关联
# 创建多表数据
students = pd.DataFrame({
'StudentID': [1, 2, 3, 4],
'Name': ['Alice', 'Bob', 'Charlie', 'David']
})
courses = pd.DataFrame({
'CourseID': [101, 102, 103],
'CourseName': ['Math', 'Physics', 'Chemistry']
})
enrollments = pd.DataFrame({
'StudentID': [1, 1, 2, 3, 4],
'CourseID': [101, 102, 101, 103, 102],
'Grade': [85, 92, 78, 95, 88]
})
# 多表合并
result = students.merge(enrollments, on='StudentID') \
.merge(courses, on='CourseID')
print("学生选课信息:")
print(result[['Name', 'CourseName', 'Grade']])
处理重复列名
# 创建有重复列名的数据
df11 = pd.DataFrame({
'ID': [1, 2, 3],
'Value': [10, 20, 30],
'Data': ['A', 'B', 'C']
})
df12 = pd.DataFrame({
'ID': [1, 2, 4],
'Value': [15, 25, 35],
'Info': ['X', 'Y', 'Z']
})
# 使用suffixes处理重复列名
merged_with_suffix = pd.merge(df11, df12, on='ID', how='outer',
suffixes=('_left', '_right'))
print("处理重复列名:")
print(merged_with_suffix)
- merge(): 适用于数据库风格的合并,基于列值
- concat(): 适用于简单的轴向拼接
- join(): 适用于基于索引的合并
- 选择合适的合并方式取决于数据结构和需求
建议根据实际业务场景选择最合适的合并方法,并注意处理好重复列名、缺失值等问题。
标签: 案例编写