Pandas groupby后如何获取排除末尾指定数的倒数N条分组数据
Pandas groupby分组后取倒数N条并排除最新K条的实现方案
核心实现逻辑
- 自定义两个参数:
n为需要提取的倒数数据条数,offset为需要排除的最新数据条数 - 对每个分组使用
iloc切片,利用Python切片左闭右开的特性,范围取[-n-offset : -offset]即可刚好跳过最后offset条,取前面的n条 - 也可以用
tail(n+offset).head(n)的组合实现相同效果,可读性更强
完整代码示例
import pandas as pd # 构造测试数据 df = pd.DataFrame({ 'A': [1,1,1,1,1,1,1,1,1], 'B': [1,2,3,4,5,6,7,8,9] }) # 自定义参数 n = 3 # 取倒数3条 offset = 2 # 排除最新2条 # 方案1:iloc切片实现(自带边界兼容) result = df.groupby('A', group_keys=False).apply( lambda x: x.iloc[max(0, len(x)-n-offset) : len(x)-offset] ) # 方案2:tail+head组合实现(写法更直观) # result = df.groupby('A', group_keys=False).apply( # lambda x: x.tail(n + offset).head(n) # ) print(result)
执行后输出结果完全符合预期:
A B 4 1 5 5 1 6 6 1 7
边界处理说明
- 代码中加入
max(0, len(x)-n-offset)是为了兼容分组总长度小于n+offset的场景,不会出现索引报错,会自动返回排除offset条后剩余的所有数据 - 如果要求分组长度不足
n+offset时返回空,可以在lambda中补充判断逻辑:lambda x: x.iloc[len(x)-n-offset : len(x)-offset] if len(x) >= n+offset else pd.DataFrame(columns=x.columns)
内容的提问来源于stack exchange,提问作者RazDva
相关产品推荐
相关产品推荐

