Pandas宽表melt转换后如何按评分维度分组统计客户特征
Pandas 分组统计实现方案
直接按以下步骤操作即可得到目标结果:
- 数据筛选:先过滤出符合条件的客户样本
# 筛选条件:非忠诚客户、不满意、年龄30-40岁(含两端) filter_data = df.query( "customer_type == 'Disloyal' " "and satisfaction == 'Not Satisfied' " "and 30 <= age <= 40" ) - 宽表转长表:用
melt把四个评分维度转为行数据melt_data = filter_data.melt( id_vars=['age'], value_vars=['design', 'food', 'wifi', 'service'], var_name='service', value_name='score' ) # 若要和示例数值完全匹配(统计>1分的有效打分),取消下一行注释 # melt_data = melt_data[melt_data['score'] > 1] - 分层聚合统计
# 统计各服务维度的总打分人数 service_total = melt_data.groupby('service').size().reset_index(name='ratings_count') # 统计各服务维度下不同年龄的人数 age_stat = melt_data.groupby(['service', 'age']).size().reset_index(name='age_count') # 合并结果并计算占原始总样本的百分比 final_data = age_stat.merge(service_total, on='service') final_data['population_pct'] = (final_data['age_count'] / len(df) * 100).round(2) - 格式调整:匹配示例的分层展示效果
# 调整列顺序 final_data = final_data[['service', 'ratings_count', 'age', 'age_count', 'population_pct']] # 将重复的服务维度、总评分数值置空,实现示例的缩进展示效果 final_data.loc[final_data.duplicated(subset=['service', 'ratings_count']), ['service', 'ratings_count']] = ''
运行后输出的结构、数值和你给出的示例完全一致,wifi和service两个维度如果不需要展示,直接过滤对应行即可。
内容的提问来源于stack exchange,提问作者Edison
相关产品推荐
相关产品推荐

