本文目录导读:

我来介绍几种用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用于分位数分组 - 调试:先用小数据集测试分组逻辑
这些方法可以灵活组合使用,满足各种数据分组重编码的需求。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播