
本教程详细阐述了如何在Pandas DataFrame中,针对连续的特定标志(如HH或LL)分组,并从每个组中仅保留满足特定条件(如最高High值或最低Low值)的行,同时重置其他行的标志。文章通过groupby.transform结合布尔索引,提供了一种高效且专业的解决方案,避免了迭代和潜在的性能问题。
1. 问题背景与数据准备
在数据分析场景中,我们经常需要从时间序列或分组数据中识别出关键的“峰值”或“谷值”。例如,在一个交易数据集中,我们可能希望识别连续上涨(HH为True)或连续下跌(LL为True)区间内的最高点或最低点,并只保留这些关键点,而将同一区间内的其他点标记为非关键。
假设我们有一个Pandas DataFrame,其中包含HH和LL两个布尔列,分别表示“高高点”和“低低点”的趋势,以及对应的High和Low数值列。我们的目标是:
对于连续的HH为True的行,只保留其中High值最高的行,将其余HH为True的行改为HH为False。对于连续的LL为True的行,只保留其中Low值最低的行,将其余LL为True的行改为LL为False。
以下是示例数据框的创建:
import pandas as pdmydict = [ {'HH': True, 'LL': False, 'High': 10, 'Low': 1}, {'HH': False, 'LL': True, 'High': 100, 'Low': 20}, {'HH': True, 'LL': False, 'High': 32, 'Low': 1}, {'HH': True, 'LL': False, 'High': 30, 'Low': 1}, {'HH': True, 'LL': False, 'High': 31, 'Low': 1}, {'HH': False, 'LL': True, 'High': 100, 'Low': 40}, {'HH': False, 'LL': True, 'High': 100, 'Low': 45}, {'HH': False, 'LL': True, 'High': 100, 'Low': 42}, {'HH': False, 'LL': True, 'High': 100, 'Low': 44}, {'HH': True, 'LL': False, 'High': 50, 'Low': 1}, ]df = pd.DataFrame(mydict)print("原始DataFrame:")print(df)
输出的原始DataFrame如下:
原始DataFrame: HH LL High Low0 True False 10 11 False True 100 202 True False 32 13 True False 30 14 True False 31 15 False True 100 406 False True 100 457 False True 100 428 False True 100 449 True False 50 1
2. 解决方案:使用groupby.transform进行高效分组与筛选
为了解决上述问题,我们需要一个能够识别连续HH或LL块的机制,并在这些块内部执行聚合操作。Pandas的groupby.transform方法是实现这一目标的强大工具。
2.1 核心思路
创建分组标识: 首先,我们需要定义什么是“连续的HH或LL块”。当HH或LL列的模式发生变化时,就认为是一个新组的开始。组内最大/最小值识别: 在每个识别出的组内,计算High列的最大值和Low列的最小值,并将其广播回原始DataFrame的每一行。布尔索引筛选: 比较原始的High和Low值与广播回来的组内最大/最小值,生成布尔掩码。更新DataFrame: 根据布尔掩码
以上就是在Pandas中按组筛选最大/最小值:识别连续峰谷数据点的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1375578.html
微信扫一扫
支付宝扫一扫