You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas分组(groupby)后如何按差值小于20的条件过滤行?

问题:分组后过滤相邻行Value差值小于20的行

原始数据

A     B     Value
1     1       0
1     2       10
1     2       20
1     2       25
2     1       0
2     1       15
2     1       100

分组后的数据(按['A', 'B']分组)

A     B     Value
1     1       0           
1     2       10
      2       20
      2       25
2     1       0
      1       15
      1       100

过滤规则

  • 分组内第一行(无前置行)直接过滤
  • 分组内当前行与前一行的Value差值小于20时,保留当前行
  • 差值大于等于20时,过滤当前行

期望结果

A     B     Value
1     2       20
1     2       25
2     1       15

尝试的错误代码

df.groupby(['A', 'B']).filter(lambda x : (x['Value'] - x['Value'].shift(1) < 20).any())

解决方案

你用的filter方法是保留整个分组,只要分组内存在任意一行满足条件就会保留整个组的所有行,这和你需要的行级过滤逻辑不符。正确的做法是先计算每个分组内相邻行的差值,再基于差值过滤行:

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'A': [1,1,1,1,2,2,2],
    'B': [1,2,2,2,1,1,1],
    'Value': [0,10,20,25,0,15,100]
})

# 计算每个分组内Value与前一行的差值
df['diff'] = df.groupby(['A', 'B'])['Value'].diff()

# 过滤:差值小于20且排除无前置行的NaN值
result = df[(df['diff'] < 20) & (~df['diff'].isna())].drop(columns='diff')

print(result)

运行后输出:

A  B  Value
2  1  2     20
3  1  2     25
5  2  1     15

如果需要考虑差值的绝对值(比如后一行比前一行小的情况),可以把条件改成df['diff'].abs() < 20。

内容的提问来源于stack exchange,提问作者JohnTroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:15:33