Pandas分组多条件过滤:筛选阳线且形成Lower Low的完整股票分组
股票筛选问题处理方案
原始数据
Date Symbol Open High Low Close 0 2023-05-31 GEDIK.IS 7.90 8.01 7.77 7.87 1 2023-06-01 GEDIK.IS 7.92 8.20 7.89 8.14 2 2023-05-31 MIPAZ.IS 7.87 7.90 7.74 7.84 3 2023-06-01 MIPAZ.IS 7.84 8.06 7.80 8.05 4 2023-05-31 SUNTK.IS 36.20 37.52 35.48 37.00 5 2023-06-01 SUNTK.IS 37.20 38.30 36.60 38.30 6 2023-05-31 VANGD.IS 7.26 7.36 6.95 7.08 7 2023-06-01 VANGD.IS 7.09 7.63 6.92 7.48
需求
筛选同时满足以下两个条件的股票完整数据:
- 2023-06-01当日为阳线(Close > Open)
- 当日与前一日形成Lower Low(LL):2023-06-01的Low低于2023-05-31的Low
示例中仅VANGD.IS符合要求。
当前问题
现有代码df.groupby(['Symbol']).apply(lambda x: x[x["Low"] > x["Low"].shift(-1)])仅能筛选出LL相关的单行数据,无法获取符合条件股票的完整分组,且未结合阳线条件过滤,同时处理500只股票时效率不足。
高效解决方案
采用分组聚合计算条件+符号过滤的方式,避免逐组循环带来的性能损耗:
步骤1:排序并分组计算核心条件
先确保数据按股票和日期排序,再通过分组聚合验证两个条件:
# 按股票和日期排序,保证日期顺序正确 df_sorted = df.sort_values(['Symbol', 'Date']).reset_index(drop=True) # 分组计算两个条件:6月1日是否阳线、是否形成Lower Low grouped_check = df_sorted.groupby('Symbol').agg( is_rising=('Close', lambda x: x.iloc[-1] > x.iloc[-2] if len(x)>=2 else False), is_lower_low=('Low', lambda x: x.iloc[-1] < x.iloc[-2] if len(x)>=2 else False) ) # 提取同时满足两个条件的股票符号 target_symbols = grouped_check[(grouped_check['is_rising'] & grouped_check['is_lower_low'])].index
步骤2:提取符合条件的完整股票数据
用筛选出的股票符号过滤原始排序数据,得到完整分组:
result = df_sorted[df_sorted['Symbol'].isin(target_symbols)]
执行结果
输出结果如下:
Date Symbol Open High Low Close 6 2023-05-31 VANGD.IS 7.26 7.36 6.95 7.08 7 2023-06-01 VANGD.IS 7.09 7.63 6.92 7.48
性能说明
该方案利用groupby.agg做向量化计算,避免了apply的逐组循环,处理500只股票时效率远高于原方案。
内容的提问来源于stack exchange,提问作者Coin Bey
相关产品推荐
相关产品推荐

