Python数据分组案例如何实现?

wen python案例 1

本文目录导读:

  1. 使用基础Python实现分组
  2. 使用itertools.groupby
  3. 使用Pandas进行分组(推荐)
  4. 复杂分组案例
  5. 实战案例:客户分层分析
  6. 自定义分组函数

我来介绍几种常见的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())
  1. 基础方法:使用字典或defaultdict适合简单场景
  2. itertools.groupby:需要先排序,适合内存占用敏感的场景
  3. Pandas:功能最强大,推荐在数据分析中使用
  4. 自定义函数:灵活处理复杂分组需求

选择哪种方法取决于你的具体需求:

  • 数据量小:基础方法即可
  • 数据分析:推荐Pandas
  • 机器学习:建议使用Pandas+sklearn

标签: groupby 聚合

抱歉,评论功能暂时关闭!