Python案例如何用Pandas做数据分组重编码

wen python案例 3

本文目录导读:

Python案例如何用Pandas做数据分组重编码

  1. 基础分组重编码
  2. 条件分组重编码
  3. 聚合统计后的重编码
  4. 实际案例:学生成绩分组
  5. 复杂的条件重编码
  6. 分位数分组重编码
  7. 实际应用:客户价值分组(RFM)
  8. 小贴士

我来介绍几种用Pandas进行数据分组重编码的方法:

基础分组重编码

import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
    '城市': ['北京', '上海', '广州', '深圳', '北京', '上海', '广州'],
    '销售额': [100, 200, 150, 180, 120, 220, 160],
    '年份': [2020, 2020, 2020, 2020, 2021, 2021, 2021]
})
print("原始数据:")
print(df)
print()
# 方法1:使用map进行简单重编码
city_code = {'北京': 'BJ', '上海': 'SH', '广州': 'GZ', '深圳': 'SZ'}
df['城市代码'] = df['城市'].map(city_code)
print("使用map重编码:")
print(df)
print()

条件分组重编码

# 方法2:基于条件的重编码
df['销售额等级'] = pd.cut(df['销售额'], 
                        bins=[0, 150, 200, 300],
                        labels=['低', '中', '高'])
print("基于销售额分组:")
print(df)
print()
# 方法3:自定义条件函数
def sales_level(x):
    if x < 150:
        return '低'
    elif x < 200:
        return '中'
    else:
        return '高'
df['销售额等级2'] = df['销售额'].apply(sales_level)
print("自定义函数分组:")
print(df)

聚合统计后的重编码

# 方法4:聚合统计后进行重编码
city_stats = df.groupby('城市')['销售额'].agg(['mean', 'sum', 'count'])
print("城市销售额统计:")
print(city_stats)
print()
# 根据平均值重新编码
city_stats['业绩等级'] = pd.cut(city_stats['mean'],
                               bins=[0, 150, 200, 300],
                               labels=['一般', '良好', '优秀'])
print("重编码后的统计:")
print(city_stats)

实际案例:学生成绩分组

# 创建学生成绩数据
students = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
    '班级': ['A班', 'A班', 'A班', 'B班', 'B班', 'B班'],
    '语文': [85, 92, 78, 88, 95, 70],
    '数学': [90, 85, 88, 92, 78, 82],
    '英语': [88, 90, 85, 78, 92, 80]
})
print("学生成绩数据:")
print(students)
print()
# 计算平均分
students['平均分'] = students[['语文', '数学', '英语']].mean(axis=1)
print("计算平均分:")
print(students)
print()
# 按班级计算统计量
class_stats = students.groupby('班级').agg({
    '平均分': ['mean', 'std', 'max', 'min']
}).round(2)
print("班级统计:")
print(class_stats)

复杂的条件重编码

# 更复杂的条件重编码示例
def grade_coder(row):
    avg_score = row['平均分']
    class_name = row['班级']
    # 不同班级有不同的评分标准
    if class_name == 'A班':
        if avg_score >= 90:
            return 'A班优秀'
        elif avg_score >= 80:
            return 'A班良好'
        else:
            return 'A班及格'
    else:  # B班
        if avg_score >= 88:
            return 'B班优秀'
        elif avg_score >= 78:
            return 'B班良好'
        else:
            return 'B班及格'
students['等级'] = students.apply(grade_coder, axis=1)
print("复杂条件重编码:")
print(students)
print()
# 查看各等级人数
grade_counts = students['等级'].value_counts()
print("各等级人数统计:")
print(grade_counts)

分位数分组重编码

# 使用分位数进行分组
df = pd.DataFrame({
    '产品': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
    '销量': [100, 200, 150, 300, 250, 180, 120, 280]
})
print("产品销量数据:")
print(df)
print()
# 按销量分位数分组
df['销量组'] = pd.qcut(df['销量'], q=4, labels=['低', '中低', '中高', '高'])
print("四分位数分组:")
print(df)
print()
# 查看分组统计
group_stats = df.groupby('销量组')['销量'].describe()
print("分组统计:")
print(group_stats)

实际应用:客户价值分组(RFM)

# RFM分析的简单示例
rfm_data = pd.DataFrame({
    '客户ID': range(1, 11),
    '消费金额': [500, 3000, 800, 1500, 2000, 100, 4000, 600, 2500, 3500],
    '购买次数': [3, 10, 5, 7, 8, 1, 12, 4, 9, 11],
    '最后购买天数': [30, 5, 60, 15, 10, 90, 2, 45, 7, 3]
})
print("RFM数据:")
print(rfm_data)
print()
# 定义分组规则
def customer_segment(row):
    score = 0
    # 消费金额评分
    if row['消费金额'] >= 3000:
        score += 3
    elif row['消费金额'] >= 1500:
        score += 2
    else:
        score += 1
    # 购买次数评分
    if row['购买次数'] >= 10:
        score += 3
    elif row['购买次数'] >= 5:
        score += 2
    else:
        score += 1
    # 客户等级
    if score >= 5:
        return '高价值客户'
    elif score >= 3:
        return '中等价值客户'
    else:
        return '低价值客户'
rfm_data['客户等级'] = rfm_data.apply(customer_segment, axis=1)
print("客户价值分组:")
print(rfm_data)
print()
# 统计各等级客户
segment_stats = rfm_data.groupby('客户等级').agg({
    '客户ID': 'count',
    '消费金额': 'mean',
    '购买次数': 'mean'
}).round(2)
print("客户等级统计:")
print(segment_stats)

小贴士

  1. 性能考虑:对于大数据集,使用 mapcutapply 更快
  2. 可读性:复杂条件建议写成函数,并用 apply 调用
  3. 连续性pd.cut 用于数值分段,pd.qcut 用于分位数分组
  4. 调试:先用小数据集测试分组逻辑

这些方法可以灵活组合使用,满足各种数据分组重编码的需求。

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