使用Pandas计算分组内各类型数据的占比
用Pandas实现分组计算占比的思路与代码实现
我来给你拆解下怎么用Pandas搞定这个需求,步骤很清晰:
第一步:读取CSV数据
先把你的CSV文件载入Pandas的DataFrame,假设文件名为crime_data.csv,用pd.read_csv()就能轻松搞定。第二步:计算分组内的总数量
我们需要先拿到每个(Beat、Hour、Month)组合对应的COUNTER总和,这里用groupby配合transform是最优解——transform会把组级别的计算结果自动映射到每一行,这样每一行都能直接获取自己所在组的总数,不用额外做数据合并。第三步:计算占比并整理结果
用每行的COUNTER数值除以所在组的总数,再乘以100就得到了该Primary Type在组内的占比,还可以按需保留小数位数让结果更规整。
具体代码实现
import pandas as pd # 读取CSV数据到DataFrame df = pd.read_csv("crime_data.csv") # 计算每个分组的COUNTER总和,通过transform广播到每一行 df["group_total"] = df.groupby(["Beat", "Hour", "Month"])["COUNTER"].transform("sum") # 计算占比,保留两位小数(可根据需求调整) df["percentage"] = (df["COUNTER"] / df["group_total"] * 100).round(2) # 整理出需要的结果列,也可以按需排序 result_df = df[["Beat", "Hour", "Month", "Primary Type", "COUNTER", "percentage"]] print(result_df)
关键步骤解释
groupby(["Beat", "Hour", "Month"])["COUNTER"].transform("sum"):这一步会按指定的三列分组,计算每组的COUNTER总和,然后把这个总和赋值给组内的每一行。比如Beat=111、Hour=10AM、Month=Apr的组,所有行的group_total都会是22(12+5+1+4)。(df["COUNTER"] / df["group_total"] * 100).round(2):直接用每行的COUNTER除以组总数得到占比,乘以100转成百分比格式,round(2)是保留两位小数,让结果更易读。
如果需要把结果导出成新的CSV文件,只需要执行result_df.to_csv("crime_with_percentage.csv", index=False)即可。
内容的提问来源于stack exchange,提问作者buddingengineer
相关产品推荐
相关产品推荐

