如何对Pandas DataFrame按年份每两月分组并保留时间排序能力
解决方案
你可以直接通过数值计算生成双月编号,天然支持排序,无需手动写映射字典,逻辑更简洁通用:
方法1:直接计算双月编号(推荐)
通过整数运算得到数值型双月标识,排序、分组都更方便,也可以随时转成你需要的「1-2」这类区间展示格式:
import pandas as pd # 示例DataFrame df = pd.DataFrame({'year' : [2020, 2020, 2021, 2021], 'month': [1, 2, 3, 4], 'score': [10,20,30,40]}) # 计算数值型双月编号,1-2月对应1、3-4月对应2,以此类推,天然支持排序 df['bi_month_idx'] = (df['month'] - 1) // 2 + 1 # 按需生成区间展示字段 df['bi_month_range'] = df['bi_month_idx'].apply(lambda x: f"{2*x-1}-{2*x}") # 分组聚合,结果默认按年份、双月顺序排序 res = df.groupby(['year', 'bi_month_idx', 'bi_month_range'], as_index=False)['score'].mean() # 不需要编号字段可直接删除 res = res.drop('bi_month_idx', axis=1)
方法2:基于datetime重采样
如果你的场景已经在使用datetime类型字段,可以直接用pandas重采样的双月频率实现:
# 生成年月日期字段 df['date'] = pd.to_datetime(df[['year', 'month']].assign(day=1)) # 按双月频率重采样求均值 res = df.set_index('date').resample('2M', closed='left')['score'].mean().reset_index() # 提取年份和双月区间 res['year'] = res['date'].dt.year res['bi_month_range'] = res['date'].dt.month.apply(lambda x: f"{x}-{x+1}")
两种方法都不需要手动维护月份映射字典,也不存在排序问题,其中方法1计算更轻量,适配性更高。
内容的提问来源于stack exchange,提问作者nafrtiti
相关产品推荐
相关产品推荐

