基于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)
代码说明
- 分组阶段通过
agg方法分别统计每组的total总和与used总和,这是计算占比的核心基础 - 用分组后的总消费除以总额度得到占比,通过
round(2)保留两位小数,与期望输出格式匹配 - 最后筛选出目标列,得到符合要求的结果
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

