首页 > 解决方案 > 选择pandas groupby系列中的值,小于和随后大于阈值

问题描述

我有一个数据框如下

df = pd.DataFrame({'subjects':['A','A','B','C','A','A','B','B','C','C'],
                  'value':[3,5,5,6,7,2,4,8,9,2]})

subjects    value
A            3
A            5
B            5
C            6
A            7
A            2
B            4
B            8
C            9
C            2

现在我想选择那些subjects在某个点value小于 5 并且在小于 5 的点之后的某个其他后续点变得大于 5 的那些value。在这个数据框中,它将是 A 和 B。

我试过这个:

df[df.groupby('subjects').value.apply(lambda x: x > 5)]

但它选择那些value大于 5 的,我希望初始values 小于 5,如果值发生变化并且后续value大于 5,则返回那些subjects

标签: pythonpandaspandas-groupby

解决方案


这是使用逻辑屏蔽的解决方案。然后我们将.cummax()其用作逻辑的快捷方式,然后向前。现在我们有了一个掩码,它标识了第一个 < 5 值之后的每个元素。然后比较起来很简单(v[m]>5).any()

def lt_then_gt_threshold(v, thresh=5):
    m = (v<thresh).cummax()
    return (v[m]>thresh).any()

>>> subjs = df.groupby('subjects')['value'].apply(lt_then_gt_5)

subjects
A     True
B     True
C    False

>>> subjs[subjs==True].index.tolist()

['A', 'B']

推荐阅读