Python对DataFrame应用行级条件函数识别相对最大值及报错处理
解决方案
你遇到的报错本质是apply逐行调用时传入了完整Series作为get_max参数,对整个Series做布尔判断才会触发歧义错误,完全无需自定义函数和循环,直接用pandas向量化条件判断即可实现需求:
第一步:修正DataFrame构造
你原代码的df构造缺少high列名,先补全:
import pandas as pd temp_list = [128.71, 130.2242, 131.0, 131.45, 129.69, 130.17, 132.63, 131.63, 131.0499, 131.74, 133.6116, 134.74, 135.99, 138.789, 137.34, 133.46, 132.43, 134.405, 128.31, 129.1] df_data = pd.DataFrame(temp_list, columns=['high']) # 自定义n值,比如取此前3个值做比较 n = 3
第二步:计算滚动最大值
这部分你原有逻辑是对的,shift()是为了排除当前行,只取此前n个值的最大值:
df_data['rolling_max'] = df_data['high'].rolling(n).max().shift()
第三步:向量化条件判断生成ismax列
直接把三个判断条件按位与后转整型即可,全程无循环:
cond1 = df_data['high'] > df_data['high'].shift(1) # 大于前一个相邻值 cond2 = df_data['high'] > df_data['high'].shift(-1) # 大于后一个相邻值 cond3 = df_data['high'] > df_data['rolling_max'] # 大于此前n个值的最大值 df_data['ismax'] = (cond1 & cond2 & cond3).astype(int)
结果说明
- 首行无前一个相邻值、末行无后一个相邻值,默认会返回0,符合业务逻辑
- 所有运算都是pandas原生向量化操作,运行效率远高于逐行apply
内容的提问来源于stack exchange,提问作者arodrisa
相关产品推荐
相关产品推荐

