本文目录导读:
我来介绍几种常见的Python数据分组实现方法。
使用基础Python实现分组
字典分组法
from collections import defaultdict
# 示例数据:员工信息
employees = [
{'name': '张三', 'dept': '技术部', 'salary': 15000},
{'name': '李四', 'dept': '市场部', 'salary': 12000},
{'name': '王五', 'dept': '技术部', 'salary': 18000},
{'name': '赵六', 'dept': '市场部', 'salary': 13000},
{'name': '钱七', 'dept': '人事部', 'salary': 14000}
]
# 按部门分组
dept_groups = defaultdict(list)
for emp in employees:
dept_groups[emp['dept']].append(emp)
print("按部门分组结果:")
for dept, emps in dept_groups.items():
print(f"{dept}: {len(emps)}人")
使用itertools.groupby
from itertools import groupby
from operator import itemgetter
# 需要先排序
employees_sorted = sorted(employees, key=itemgetter('dept'))
# 按部门分组
for dept, group in groupby(employees_sorted, key=itemgetter('dept')):
group_list = list(group)
print(f"{dept}: {[emp['name'] for emp in group_list]}")
使用Pandas进行分组(推荐)
import pandas as pd
# 创建DataFrame
df = pd.DataFrame(employees)
print("原始数据:")
print(df)
# 1. 基本分组统计
print("\n按部门分组统计平均薪资:")
print(df.groupby('dept')['salary'].mean())
# 2. 多列分组
print("\n按部门和薪资范围分组:")
df['salary_level'] = pd.cut(df['salary'],
bins=[0, 13000, 16000, float('inf')],
labels=['低', '中', '高'])
print(df.groupby(['dept', 'salary_level']).size())
# 3. 聚合操作
print("\n分组聚合统计:")
result = df.groupby('dept').agg({
'salary': ['mean', 'max', 'min', 'count'],
'name': 'count'
})
print(result)
复杂分组案例
销售数据分析
import pandas as pd
import numpy as np
from datetime import datetime
# 生成模拟销售数据
sales_data = {
'日期': pd.date_range('2024-01-01', periods=100, freq='D'),
'产品': np.random.choice(['A', 'B', 'C'], 100),
'区域': np.random.choice(['华东', '华南', '华北'], 100),
'销售额': np.random.randint(1000, 10000, 100),
'数量': np.random.randint(10, 100, 100)
}
df_sales = pd.DataFrame(sales_data)
# 按产品和区域分组,统计销售情况
result = df_sales.groupby(['产品', '区域']).agg({
'销售额': ['sum', 'mean', 'std'],
'数量': 'sum',
'日期': 'count'
}).round(2)
print("产品销售分析:")
print(result)
# 按月份和产品分组
df_sales['月份'] = df_sales['日期'].dt.month
print("\n月度产品销售额:")
monthly = df_sales.pivot_table(
values='销售额',
index='月份',
columns='产品',
aggfunc='sum',
fill_value=0
)
print(monthly)
实战案例:客户分层分析
import pandas as pd
# 客户数据
customers = pd.DataFrame({
'客户ID': range(1, 21),
'消费金额': [500, 1200, 300, 800, 2000, 150, 3500, 900, 600, 2500,
1800, 400, 2800, 700, 3200, 1000, 450, 1600, 550, 2100],
'购买次数': [3, 8, 2, 5, 15, 1, 25, 6, 4, 18,
12, 3, 20, 5, 22, 7, 3, 10, 4, 14],
'注册时间': pd.date_range('2023-01-01', periods=20, freq='M')
})
# 客户分层
def customer_segment(row):
if row['消费金额'] >= 3000 and row['购买次数'] >= 15:
return 'VIP'
elif row['消费金额'] >= 1000:
return '普通'
else:
return '潜在'
customers['客户分层'] = customers.apply(customer_segment, axis=1)
# 分析各层客户
analysis = customers.groupby('客户分层').agg({
'客户ID': 'count',
'消费金额': ['sum', 'mean'],
'购买次数': ['mean', 'max']
}).round(2)
print("客户分层分析:")
print(analysis)
自定义分组函数
import pandas as pd
# 自定义分组逻辑
def age_group(age):
if age < 18:
return '未成年'
elif age < 35:
return '青年'
elif age < 55:
return '中年'
else:
return '老年'
# 示例数据
users = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [25, 17, 45, 60, 32],
'score': [85, 92, 78, 88, 95]
})
# 使用自定义函数分组
users['年龄段'] = users['age'].apply(age_group)
print(users.groupby('年龄段')['score'].describe())
- 基础方法:使用字典或defaultdict适合简单场景
- itertools.groupby:需要先排序,适合内存占用敏感的场景
- Pandas:功能最强大,推荐在数据分析中使用
- 自定义函数:灵活处理复杂分组需求
选择哪种方法取决于你的具体需求:
- 数据量小:基础方法即可
- 数据分析:推荐Pandas
- 机器学习:建议使用Pandas+sklearn