客户成本分组汇总可视化需求:小占比客户合并为‘remaining’
客户成本汇总与可视化问题解决方案
问题点梳理
- 原代码将成本列重命名为
count并强制转成整数,丢失了成本的小数精度 - 饼图默认展示百分比,未按需求显示实际总成本
- 使用了Pandas已弃用的
append方法,存在版本兼容风险 - 最终输出的格式未匹配期望的索引结构
修正后的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 使用你提供的原始数据 df = pd.DataFrame({ "customerId": [1,1,1,2,2,2,3,3,3,4,4,4,4,4,4], "costs": [1.054722,3.287335,1.920475,0.502692,4.900304,2.676288,0.455319,3.261040,2.049914,2.293546,1.353868,0.018763,4.371444,3.082480,3.056038] }) # 设置占比阈值,低于该值的客户合并为remaining threshold = 0.1 # 1. 按客户分组计算总成本 df_grouped = df.groupby('customerId')['costs'].sum().reset_index() # 2. 计算每个客户成本的占比 df_grouped['percentage'] = df_grouped['costs'] / df_grouped['costs'].sum() # 3. 分离达标客户和需要合并的小占比客户 df_top_customers = df_grouped[df_grouped['percentage'] >= threshold] df_small_customers = df_grouped[df_grouped['percentage'] < threshold] # 4. 汇总小占比客户为remaining if not df_small_customers.empty: remaining_row = pd.DataFrame({ 'customerId': ['remaining'], 'costs': [df_small_customers['costs'].sum()], 'percentage': [df_small_customers['percentage'].sum()] }) df_final = pd.concat([df_top_customers, remaining_row], ignore_index=True) else: df_final = df_top_customers # 调整为你期望的输出格式 df_final = df_final.set_index('customerId')[['costs']] print("汇总结果:") print(df_final) # 5. 可视化:饼图展示实际总成本 plt.figure(figsize=(8, 8)) colors = sns.color_palette('GnBu_r') # 自定义饼图标签,显示实际成本数值而非百分比 def show_cost_value(values): def format_func(pct): total_cost = sum(values) actual_cost = pct * total_cost / 100 return f'{actual_cost:.2f}' return format_func plt.pie(df_final['costs'], labels=df_final.index, colors=colors, autopct=show_cost_value(df_final['costs']), pctdistance=0.8) plt.title('客户总成本分布') plt.show()
修正说明
- 保留了成本的原始小数精度,未做强制整数转换
- 替换已弃用的
append为pd.concat,适配新版Pandas - 饼图通过自定义
autopct函数展示实际总成本数值,而非百分比 - 最终输出格式完全匹配你期望的索引结构
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

