Pandas分组滚动聚合时如何保留日期字段的技术咨询
保留滚动统计结果对应的日期字段
你可以通过以下两种方式解决结果丢失date字段的问题:
方法1:将日期设为多级索引后计算
把id和date设为多级索引,滚动统计的结果会保留这两个索引,后续通过reset_index()可将它们转回列:
import pandas as pd df = pd.DataFrame({'id': [1, 1, 1, 2, 2, 2], 'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'], 'value': [5, 4, 7, 2, 7, 1]}) df['date'] = pd.to_datetime(df['date']) # 设置多级索引 df_indexed = df.set_index(['id', 'date']) # 计算滚动统计并重置索引 rolling_result = df_indexed.groupby('id')['value'].rolling(2).agg({'sum': 'sum', 'mean': 'mean'}).reset_index() print(rolling_result)
输出会包含id、date以及对应的滚动统计值,每个统计结果都能匹配到对应的日期。
方法2:用transform直接在原表添加统计列
使用transform可以将滚动统计结果直接对齐到原DataFrame的行,自然保留所有原有字段(包括date):
import pandas as pd df = pd.DataFrame({'id': [1, 1, 1, 2, 2, 2], 'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'], 'value': [5, 4, 7, 2, 7, 1]}) df['date'] = pd.to_datetime(df['date']) # 添加滚动统计列 df['rolling_sum'] = df.groupby('id')['value'].rolling(2).sum().reset_index(level=0, drop=True) df['rolling_mean'] = df.groupby('id')['value'].rolling(2).mean().reset_index(level=0, drop=True) print(df)
这种方式无需额外处理索引,直接在原数据基础上新增统计字段,日期字段会和统计值一一对应。
原代码的问题在于仅对value列执行滚动操作,结果索引只保留了分组的id和滚动的位置序号,因此丢失了date字段。上述两种方法通过索引关联或行对齐的方式,确保日期信息不会丢失。
内容的提问来源于stack exchange,提问作者zzzbbx
相关产品推荐
相关产品推荐

