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
相关产品推荐
相关产品推荐

