如何在Python Pandas中按年份计算Group1与Group>1的计数比值
Pandas按年度计算分组比值实现代码
实现逻辑
按Year字段分组,分别统计每组内Group=1的计数总和、Group>1的计数总和,两者做除法得到目标比值,最终输出仅包含Year和Ratio两列的结果表。
完整可运行代码
import pandas as pd # 1. 构造题目给出的样例数据集 df = pd.DataFrame({ 'Group': [1, 2, 3, 1, 2, 3], 'Year': [2020, 2020, 2020, 2021, 2021, 2021], 'Count': [3, 5, 2, 4, 6, 3] }) # 2. 核心计算:小数据集直观写法 result = df.groupby('Year', as_index=False).apply( lambda g: pd.Series({ 'Ratio': g.loc[g['Group'] == 1, 'Count'].sum() / g.loc[g['Group'] > 1, 'Count'].sum() }) ) # 3. 打印结果验证 print(result)
运行输出结果
Year Ratio 0 2020 0.428571 1 2021 0.444444
计算值和预期完全匹配:2020年比值为3/(5+2)=3/7≈0.4286,2021年比值为4/(6+3)=4/9≈0.4444。
补充说明
- 处理百万行以上大规模数据集时,推荐用性能更高的条件聚合写法替代
apply,减少遍历开销:
# 大数据量高性能写法 result = df.groupby('Year', as_index=False).agg( count_g1=('Count', lambda s: s[df.loc[s.index, 'Group'] == 1].sum()), count_other=('Count', lambda s: s[df.loc[s.index, 'Group'] > 1].sum()) ).assign(Ratio=lambda x: x['count_g1'] / x['count_other'])[['Year', 'Ratio']]
- 如果业务数据中存在某年无Group=1记录、或Group>1总计数为0的场景,需要在除法逻辑前增加判空、非0校验,避免出现除以0报错或空值异常。
- 如果需要输出分数形式而非浮点数结果,可以引入标准库
fractions.Fraction替换浮点除法逻辑。
内容的提问来源于stack exchange,提问作者Mai Khanh Truong
相关产品推荐
相关产品推荐

