You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pandas从现有列推导消费占比的实现问题及优化建议

问题分析与代码改进

原始数据集

client  total   avail   used    date    
charles 5000    5000    0       2/1/2022    
charles 8000    5000    3000    2/1/2022    
charles 500     500     0       3/1/2022    
cara    1000    100     900     3/1/2022    
cara    2000    50      1550    2/1/2022    
cara    500     0       500     2/1/2022    
cara    100     0       100     3/1/2022

期望输出

client  used    date            
charles 0.23    2/1/2022            
charles 0       3/1/2022            
cara    0.84    2/1/2022            
cara    1       3/1/2022            

原代码存在的问题

  • 语法错误:df["used)"]多了一个右括号,正确写法应为df["used"]
  • 逻辑错误:直接对每行计算used/total再取最大值,不符合需求——正确逻辑是先按client和date分组,计算分组内的used总和与total总和,再用总used除以总total得到占比
  • 代码冗余混乱:重复执行相同计算语句,且分组后未保存结果,逻辑链路断裂

改进后的代码

import pandas as pd

# 加载原始数据(若数据已从文件读取可跳过此步骤)
df = pd.DataFrame([
    ["charles", 5000, 5000, 0, "2/1/2022"],
    ["charles", 8000, 5000, 3000, "2/1/2022"],
    ["charles", 500, 500, 0, "3/1/2022"],
    ["cara", 1000, 100, 900, "3/1/2022"],
    ["cara", 2000, 50, 1550, "2/1/2022"],
    ["cara", 500, 0, 500, "2/1/2022"],
    ["cara", 100, 0, 100, "3/1/2022"]
], columns=["client", "total", "avail", "used", "date"])

# 按client和date分组,计算每组的总消费和总额度
grouped_data = df.groupby(['client', 'date']).agg(
    total_sum=('total', 'sum'),
    used_sum=('used', 'sum')
).reset_index()

# 计算消费占比并保留两位小数
grouped_data['used'] = (grouped_data['used_sum'] / grouped_data['total_sum']).round(2)

# 筛选出需要的列得到最终结果
final_result = grouped_data[['client', 'used', 'date']]
print(final_result)

代码说明

  1. 分组阶段通过agg方法分别统计每组的total总和与used总和,这是计算占比的核心基础
  2. 用分组后的总消费除以总额度得到占比,通过round(2)保留两位小数,与期望输出格式匹配
  3. 最后筛选出目标列,得到符合要求的结果

内容的提问来源于stack exchange,提问作者Lynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:25:31