如何在DataFrame中按分组条件获取某列前n个历史值的列表?
按分组滚动获取前3条历史值的代码修改方案
你原来的代码没有按Subject分组,因此滚动计算会跨所有记录执行,按如下修改即可实现需求:
df['Previous'] = df.groupby('Subject')['Score'].apply( lambda ser: [win.to_list()[:-1][::-1] for win in ser.rolling(4)] ).tolist()
代码逻辑说明
- 通过
groupby('Subject')将数据按学科分组,滚动操作只会在每个分组的内部执行,不会跨分组统计 - 滚动窗口大小设为4,每个窗口包含当前行和之前最多3行的Score值,取
[:-1]即可去掉当前行的Score,只保留历史值 - 加
[::-1]反转历史值的顺序,实现「最近的历史值排在列表最前面」的输出效果,和你给出的预期输出格式完全匹配
如果你的原始数据需要先按特定字段(比如时间、记录ID)排序再统计历史值,只需要在分组后先做排序即可:
df['Previous'] = df.groupby('Subject', group_keys=False).apply( lambda group: group.sort_values('排序字段名')['Score'].rolling(4).apply( lambda win: win[:-1][::-1].tolist() ) )
内容的提问来源于stack exchange,提问作者Dev Ananth
相关产品推荐
相关产品推荐

