如何循环拆分DataFrame分组并对每组执行计算及绘图操作?
问题修复方案
错误点说明
- 缩进错误:Python 要求 for 循环内部的代码必须统一缩进4个空格,你当前循环体的代码完全没有缩进,直接触发
IndentationError - 冗余筛选逻辑:
df.groupby('Segment')迭代返回的第二个参数就是对应分组的子DataFrame,不需要再次做全表筛选 - 参数错误:
color='key'属于错误写法,你需要为不同分组匹配对应颜色 - 逻辑错误:
plt.show()放在循环内部会每个分组生成一张独立图表,放在循环外才能将所有折线合并到同一张图 - 字段笔误:你统计的累计列名为
user,绘图时误用了不存在的conv字段
修改后可运行代码
import pandas as pd import matplotlib.pyplot as plt # 自定义各Segment对应的颜色,可按实际需求扩展 color_config = { "A": "red", "B": "blue", "C": "green" } # 遍历分组结果 for seg_name, seg_data in df.groupby("Segment"): # 计算天数差 seg_data["days"] = (seg_data["first"] - seg_data["last"]).dt.days # 筛选0~30天的有效数据 valid_data = seg_data[(seg_data["days"] >= 0) & (seg_data["days"] <= 30)] # 按天统计唯一用户数并计算累计值 stat_result = valid_data.groupby("days")["user"].nunique().reset_index() stat_result["cum_user"] = stat_result["user"].cumsum() # 绘制折线 plt.plot( stat_result["days"], stat_result["cum_user"], color=color_config.get(seg_name), label=seg_name ) # 统一配置图表样式 plt.legend() plt.xlabel("days") plt.ylabel("累计用户数") plt.show()
如果你无法提前枚举所有Segment值,不需要配置
color_config,删除绘图时的color参数即可,matplotlib会自动为每个分组分配差异化的颜色。
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

