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
相关产品推荐
相关产品推荐

