本文目录导读:

我来分享几个Python数据聚合的典型案例,涵盖不同场景和常用库。
Pandas数据聚合案例
案例1:销售数据汇总
import pandas as pd
import numpy as np
# 创建示例销售数据
sales_data = pd.DataFrame({
'日期': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02', '2024-01-03'],
'城市': ['北京', '上海', '北京', '上海', '广州'],
'产品': ['A', 'B', 'A', 'B', 'A'],
'销售额': [1000, 1500, 1200, 1800, 900],
'数量': [10, 15, 12, 18, 9]
})
# 按城市汇总销售额和数量
city_summary = sales_data.groupby('城市').agg({
'销售额': ['sum', 'mean', 'max'],
'数量': ['sum', 'mean']
}).round(2)
print("=== 按城市汇总 ===")
print(city_summary)
print("\n")
# 按日期和城市汇总
daily_city = sales_data.groupby(['日期', '城市']).agg({
'销售额': 'sum',
'数量': 'sum'
}).reset_index()
print("=== 按日期和城市汇总 ===")
print(daily_city)
案例2:多维度统计分析
# 创建更复杂的数据集
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
'部门': np.random.choice(['销售部', '市场部', '技术部', '人事部'], 100),
'级别': np.random.choice(['初级', '中级', '高级'], 100),
'薪资': np.random.randint(5000, 30000, 100),
'绩效分': np.random.randint(60, 100, 100),
'项目数': np.random.randint(1, 10, 100)
})
# 多维度聚合
summary = df.groupby(['部门', '级别']).agg({
'薪资': ['mean', 'std', 'min', 'max'],
'绩效分': ['mean', 'std'],
'项目数': ['sum', 'mean']
}).round(2)
print("=== 多维度统计分析 ===")
print(summary.head(10))
SQL风格聚合(pandasql)
from pandasql import sqldf
import pandas as pd
# 使用SQL语法进行聚合
sales_df = pd.DataFrame({
'region': ['华北', '华东', '华南', '华北', '华东'],
'product': ['A', 'A', 'B', 'B', 'A'],
'revenue': [100, 200, 150, 120, 180],
'quantity': [10, 20, 15, 12, 18]
})
query = """
SELECT
region,
COUNT(*) as order_count,
SUM(revenue) as total_revenue,
AVG(revenue) as avg_revenue,
SUM(quantity) as total_quantity,
MAX(revenue) as max_revenue
FROM sales_df
GROUP BY region
ORDER BY total_revenue DESC
"""
result = sqldf(query, locals())
print("=== SQL风格聚合 ===")
print(result)
实战案例:电商订单分析
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# 生成模拟订单数据
np.random.seed(123)
dates = pd.date_range('2024-01-01', '2024-01-10', freq='H')
orders = pd.DataFrame({
'order_id': range(1, 1001),
'customer_id': np.random.randint(1000, 2000, 1000),
'category': np.random.choice(['电子产品', '服装', '食品', '日用品'], 1000),
'amount': np.random.uniform(10, 500, 1000).round(2),
'quantity': np.random.randint(1, 10, 1000),
'order_date': np.random.choice(dates, 1000)
})
# 1. 按类别汇总销售额
category_sales = orders.groupby('category').agg({
'amount': ['sum', 'mean', 'count'],
'quantity': 'sum'
}).round(2)
category_sales.columns = ['总销售额', '平均订单额', '订单数', '总数量']
print("=== 类别销售汇总 ===")
print(category_sales)
print("\n")
# 2. 按日期聚合(每日销售额趋势)
daily_sales = orders.groupby(orders['order_date'].dt.date).agg({
'amount': 'sum',
'order_id': 'count'
}).reset_index()
daily_sales.columns = ['日期', '日销售额', '订单数']
print("=== 日销售趋势(前10天)===")
print(daily_sales.head(10))
print("\n")
# 3. RFM分析(客户价值分析)
from datetime import datetime
current_date = max(orders['order_date'])
rfm = orders.groupby('customer_id').agg({
'order_date': lambda x: (current_date - x.max()).days, # 最近购买时间
'order_id': 'count', # 购买频率
'amount': 'sum' # 总消费金额
}).reset_index()
rfm.columns = ['客户ID', '最近购买天数', '购买次数', '总消费']
print("=== RFM客户分析(前10名)===")
print(rfm.head(10))
使用字典进行灵活聚合
# 灵活定义聚合函数
agg_functions = {
'销售额': ['sum', 'mean', 'std', 'count'],
'数量': ['sum', 'mean'],
'利润': lambda x: x.sum() * 0.3 # 自定义函数
}
# 添加利润列
sales_data['利润'] = sales_data['销售额'] * 0.3
# 使用自定义聚合
result = sales_data.groupby('城市').agg(agg_functions)
print("=== 灵活聚合 ===")
print(result)
实际业务统计案例
# 假设这是某公司的员工绩效数据
performance = pd.DataFrame({
'employee_id': range(1, 101),
'department': np.random.choice(['技术', '产品', '销售', '运营'], 100),
'level': np.random.choice(['P3', 'P4', 'P5', 'P6', 'P7'], 100),
'salary': np.random.randint(15000, 50000, 100),
'performance_score': np.random.randint(60, 100, 100),
'projects_completed': np.random.randint(1, 20, 100),
'satisfaction': np.random.uniform(3, 5, 100).round(2)
})
# 综合绩效分析
def performance_analysis(data):
"""综合绩效分析函数"""
# 1. 部门维度统计
dept_stats = data.groupby('department').agg({
'salary': ['mean', 'median', 'std'],
'performance_score': ['mean', 'min', 'max'],
'projects_completed': 'sum',
'satisfaction': 'mean'
}).round(2)
# 2. 等级维度统计
level_stats = data.groupby('level').agg({
'salary': 'mean',
'performance_score': 'mean',
'projects_completed': 'mean',
'employee_id': 'count'
}).round(2)
# 3. 绩效等级分布(自定义区间)
def performance_level(score):
if score >= 90: return 'A'
elif score >= 80: return 'B'
elif score >= 70: return 'C'
else: return 'D'
data['绩效等级'] = data['performance_score'].apply(performance_level)
grade_dist = data.groupby('绩效等级').agg({
'employee_id': 'count',
'salary': 'mean',
'projects_completed': 'mean'
}).round(2)
return dept_stats, level_stats, grade_dist
dept_stats, level_stats, grade_dist = performance_analysis(performance)
print("=== 部门绩效统计 ===")
print(dept_stats)
print("\n=== 等级绩效统计 ===")
print(level_stats)
print("\n=== 绩效等级分布 ===")
print(grade_dist)
可视化汇总
import matplotlib.pyplot as plt
import seaborn as sns
# 创建可视化数据汇总
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
# 1. 部门薪资分布
dept_salary = performance.groupby('department')['salary'].mean().sort_values()
axes[0, 0].barh(dept_salary.index, dept_salary.values)
axes[0, 0].set_title('部门平均薪资')
# 2. 等级分布
level_count = performance['level'].value_counts()
axes[0, 1].pie(level_count.values, labels=level_count.index, autopct='%1.1f%%')
axes[0, 1].set_title('员工等级分布')
# 3. 绩效与薪资关系
axes[1, 0].scatter(performance['performance_score'], performance['salary'])
axes[1, 0].set_xlabel('绩效分')
axes[1, 0].set_ylabel('薪资')
axes[1, 0].set_title('绩效-薪资关系')
plt.tight_layout()
plt.show()
最佳实践建议
-
选择合适的方法:
- 简单统计用
describe() - 分组汇总用
groupby().agg() - 复杂分析用
pivot_table()
- 简单统计用
-
性能优化:
- 使用
agg()代替多次apply() - 大数据集考虑使用
dask或polars
- 使用
-
数据质量:
- 聚合前先处理缺失值
- 使用
dropna()或fillna()
这些案例涵盖了日常工作中80%以上的数据聚合场景,可以根据实际需求灵活调整使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播