本文目录导读:

我来介绍几种用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)
小贴士
- 性能考虑:对于大数据集,使用
map和cut比apply更快 - 可读性:复杂条件建议写成函数,并用
apply调用 - 连续性:
pd.cut用于数值分段,pd.qcut用于分位数分组 - 调试:先用小数据集测试分组逻辑
这些方法可以灵活组合使用,满足各种数据分组重编码的需求。