如何按日期与ID分组对Pandas数据做月度重采样并取每组最后值?
高效获取每个ID的月度最后记录
最直接高效的实现方式是结合groupby与pd.Grouper,在分组阶段同时完成月份聚合,直接提取每组的最后一条记录:
import pandas as pd data = [['01/01/2000', 'aaa', 101, 102], ['01/02/2000', 'aaa', 201, 202], ['01/01/2000', 'bbb', 301, 302], ['01/02/2000', 'bbb', 401, 402],] df = pd.DataFrame(data, columns=['date', 'id', 'val1', 'val2']) df['date'] = pd.to_datetime(df['date']) # 核心逻辑:按ID+月份分组,取每组最后一条数据 result = df.groupby( ['id', pd.Grouper(key='date', freq='M')] ).last().reset_index() print(result)
执行后输出符合预期的结果:
id date val1 val2 0 aaa 2000-01-31 201 202 1 bbb 2000-01-31 401 402
方案优势
- 计算效率高:直接在分组阶段完成月份维度的聚合,避免了冗余的中间计算步骤
- 结果整洁:无需额外处理冗余索引或行,
reset_index()直接生成结构清晰的DataFrame
替代实现(逻辑等价)
也可以通过dt.to_period转换日期为月份周期后分组,效果一致:
result = df.groupby( ['id', df['date'].dt.to_period('M')] ).last().reset_index() # 可选:将周期类型转回datetime格式 result['date'] = result['date'].dt.to_timestamp('M')
内容的提问来源于stack exchange,提问作者mike01010
相关产品推荐
相关产品推荐

