python - 选择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 的,我希望初始value
s 小于 5,如果值发生变化并且后续value
大于 5,则返回那些subjects
。
解决方案
这是使用逻辑屏蔽的解决方案。然后我们将.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']
推荐阅读
- python - 如何使用 python-docx 从 docx 文档中提取索引标记数据?
- angular - 当我更改选项时,角度谷歌地图不会重新加载
- linux - linux中的useradd脚本不使用passwd
- javascript - 无法将字符串分配给 MenuItem 的文本属性
- excel - File Name Extract From String works every other time
- vue.js - 上下文菜单中缺少新选项卡中的打开链接
- pandas - Pandas 数据框将数据聚合为每组的计数
- c++ - wxWidgets 中的 Unicode
- java - 如何使用 apache tomcat servlet 导航到另一个 html 文件并发送 jinja 变量?
- javascript - 转译较新的 Javascript 语法时,如何让 TypeScript 输出更少繁琐的代码?