如何用Python实现分组聚合后按不同月份数做除法运算
按ID分组计算总Value除以不同月份数
原始数据
id date value 1 2020-01-22 20 1 2020-03-12 18 1 2020-03-25 16 2 2020-04-22 20 2 2020-04-22 23
需求说明
- 先按
id和date分组,对同一日期的value求和 - 再按
id分组,将该ID下所有日期的求和后value总和,除以该ID对应的不同月份数量,得到最终结果
期望输出:
id value_after_division 1 27 2 43
注:27=(20+18+16)/2,43=(43)/1
解决方案
方法一:分步实现
- 先完成第一步分组求和,得到中间结果并重置索引:
import pandas as pd df = pd.DataFrame({ 'id': [1,1,1,2,2], 'date': ['2020-01-22','2020-03-12','2020-03-25','2020-04-22','2020-04-22'], 'value': [20,18,16,20,23] }) # 第一步:按id和date分组求和 df_grouped = df.groupby(["id", "date"])["value"].sum().reset_index()
- 提取日期对应的月份周期,再按
id分组计算总value和唯一月份数,最后做除法:
# 转换日期为月份周期(格式如2020-01) df_grouped['month'] = pd.to_datetime(df_grouped['date']).dt.to_period('M') # 按id分组计算总value和唯一月份数,再执行除法 result = df_grouped.groupby('id').apply( lambda x: x['value'].sum() / x['month'].nunique() ).reset_index(name='value_after_division') print(result)
方法二:链式调用一步完成
将步骤合并,实现更简洁的代码:
df['month'] = pd.to_datetime(df['date']).dt.to_period('M') result = ( df.groupby(['id', 'date'])['value'].sum().reset_index() .groupby('id') .agg( total_value=('value', 'sum'), unique_months=('month', 'nunique') ) .assign(value_after_division=lambda x: x['total_value'] / x['unique_months']) .drop(columns=['total_value', 'unique_months']) .reset_index() ) print(result)
两种方法最终都会输出你期望的结果。
内容的提问来源于stack exchange,提问作者bajun65537
相关产品推荐
相关产品推荐

