You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas分组聚合:基于多列自定义计算my_rate的技术问询

解决按年月分组计算指定比率的问题

嘿,我来帮你搞定这个分组计算比率的需求!先把你的需求和数据理清楚:我们需要对my_year和my_month分组,计算每组中满足waiting_time ≤ 90且target = 1的记录数,除以该组总记录数得到my_rate。

先把你的原始数据用代码还原出来:

import pandas as pd

data = {
    'id': ['001', '002', '003', '004', '005', '006', '007', '008'],
    'my_year': [2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018],
    'my_month': [1, 1, 1, 1, 2, 2, 3, 3],
    'waiting_time': [95, 3, 4, 40, 97, 3, 4, 40],
    'target': [1, 3, 0, 1, 1, 3, 0, 1]
}
df = pd.DataFrame(data)

下面给你两种高效的实现方式,按需选择:

方法一:groupby + agg(推荐,性能更优)

这种方法利用布尔值的求和特性(True=1,False=0),不需要自定义函数,运行效率更高:

result = df.groupby(['my_year', 'my_month']).agg(
    my_rate=('waiting_time', lambda x: 
             ((x <= 90) & (df.loc[x.index, 'target'] == 1)).sum() / len(x))
).reset_index()

代码解释:

  • groupby(['my_year', 'my_month']):按年份和月份对数据分组
  • 匿名lambda函数里:
    • x代表每组的waiting_time列,x.index可以拿到该组的行索引
    • (x <= 90) & (df.loc[x.index, 'target'] == 1):筛选同时满足两个条件的记录,返回布尔数组
    • .sum():统计布尔数组中True的数量(即符合条件的记录数)
    • / len(x):除以该组的总记录数得到比率
  • reset_index():把分组索引转为普通列,和你期望的输出格式一致

方法二:groupby + apply(更直观,适合复杂逻辑)

如果后续需要扩展更复杂的分组计算逻辑,用自定义函数的方式会更清晰:

def calculate_group_rate(group):
    # 统计符合条件的记录数
    valid_records = group[(group['waiting_time'] <= 90) & (group['target'] == 1)]
    valid_count = len(valid_records)
    # 计算比率
    return valid_count / len(group)

result = df.groupby(['my_year', 'my_month']).apply(calculate_group_rate).reset_index(name='my_rate')

两种方法运行后都会得到你期望的输出:

my_year  my_month  my_rate
0     2018         1     0.25
1     2018         2     0.00
2     2018         3     0.50

小提示:

如果需要控制小数位数,可以用round()方法调整,比如result['my_rate'] = result['my_rate'].round(2),按需使用即可。

内容的提问来源于stack exchange,提问作者Edamame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:24:41