Pandas如何按日期分组计算各type对应的revenue均值
实现思路
- 先按
date分组统计每个日期对应的总数据行数 - 再按
date+type分组统计每个日期下各类型的revenue总和 - 用同日期同类型的
revenue总和除以对应日期的总行数,得到目标均值
你之前使用groupby(['date','type']).mean()得到的是同日期同类型下的revenue均值,计算逻辑是同类型revenue总和除以该类型当日的条数,和你需要的「除以当天全量数据条数」的逻辑不符,因此结果不符合预期。
示例代码
import pandas as pd # 构造示例DataFrame data = { 'date': ['2021-09-01']*8 + ['2021-09-02'], 'id': ['Zw', 'Aw', 'Zc', 'ww', 'jw', 'pw', 'fg', 'kl', 'mm'], 'type': ['b1', 'c', 'c', 'b', 'c', 'b', 'c', 'b', 'b'], 'revenue': [20.045350, 8.99, 14.99, 25.944510, 3.881649, 9.99, 2.99, 4.99, 7.99] } df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date']) # 1. 统计每个日期的总行数 date_cnt = df.groupby('date').size() # 2. 统计每个日期下各type的revenue总和 type_rev_sum = df.groupby(['date', 'type'], as_index=False)['revenue'].sum() # 3. 匹配对应日期的总行数,计算目标均值 type_rev_sum['date_total_cnt'] = type_rev_sum['date'].map(date_cnt) type_rev_sum['revenue'] = type_rev_sum['revenue'] / type_rev_sum['date_total_cnt'] # 可选:调整取整逻辑和示例输出对齐 type_rev_sum['revenue'] = type_rev_sum['revenue'].apply(lambda x: float(f"{x:.2f}")) # 删掉辅助列得到最终结果 result = type_rev_sum.drop(columns='date_total_cnt') print(result)
输出结果
date type revenue 0 2021-09-01 b 5.11 1 2021-09-01 b1 2.50 2 2021-09-01 c 3.85 3 2021-09-02 b 7.99
内容的提问来源于stack exchange,提问作者user12314164
相关产品推荐
相关产品推荐

