Pandas按分类列分组统计另一列特定值的出现次数与占比
问题原因
你当前使用的df.groupby("Categories")["Clicks"].count()统计的是每个分类下Clicks列的非空值总数量,也就是该分类的总观测数,没有做Clicks==1的条件筛选,所以不符合需求。
实现代码
你可以通过分组聚合一次性计算两个所需指标,两种常用实现方式如下:
方式1:单步聚合(更简洁)
利用布尔值的数值特性:True等价于1,False等价于0,直接对Clicks==1的布尔序列求和得到计数,求均值得到概率:
import pandas as pd # 你的原始df读取后执行以下代码 result = df.groupby("Categories").agg( # 统计Clicks==1的次数 Clicks_count = ("Clicks", lambda x: (x == 1).sum()), # 计算概率并格式化为百分比 Clicks_prob = ("Clicks", lambda x: f"{round((x == 1).mean() * 100)}%") ).reset_index()
方式2:先加标记列再聚合(可读性更高)
import pandas as pd # 新增是否为点击1的标记列 df["is_click_one"] = df["Clicks"] == 1 # 分组计算 result = df.groupby("Categories").agg( Clicks_count = ("is_click_one", "sum"), Clicks_prob = ("is_click_one", lambda x: f"{round(x.mean() * 100)}%") ).reset_index()
两种方式输出的result都和你需要的目标格式完全一致。
内容的提问来源于stack exchange,提问作者amestrian
相关产品推荐
相关产品推荐

