单列连续行数据筛选:基于D_HIGH_H列的H/L规则处理
问题解决:按规则处理连续H/L序列数据
输入数据
High D_HIGH D_HIGH_H 33 46.57 0 0L 0 69.93 42 42H 1 86.44 68 68H 34 56.58 83 83L 35 67.12 125 125L 2 117.91 158 158H 36 94.51 186 186L 3 120.45 245 245H 4 123.28 254 254H 37 83.20 286 286L
处理规则
- D_HIGH_H列末尾为L或H;
- 连续两个H:保留High列值最大的行,删除另一行;
- 连续两个L:保留High列值最小的行,删除另一行;
- H/L交替序列:不做修改。
期望输出
High D_HIGH D_HIGH_H 33 46.57 0 0L 1 86.44 68 68H 34 56.58 83 83L 2 117.91 158 158H 36 94.51 186 186L 4 123.28 254 254H 37 83.20 286 286L
解决方案(Python Pandas实现)
import pandas as pd # 构造输入数据(若从文件读取可替换为pd.read_csv等方法) data = { 'High': [46.57, 69.93, 86.44, 56.58, 67.12, 117.91, 94.51, 120.45, 123.28, 83.20], 'D_HIGH': [0, 42, 68, 83, 125, 158, 186, 245, 254, 286], 'D_HIGH_H': ['0L', '42H', '68H', '83L', '125L', '158H', '186L', '245H', '254H', '286L'] } df = pd.DataFrame(data, index=[33, 0, 1, 34, 35, 2, 36, 3, 4, 37]) # 提取D_HIGH_H的末尾标签(H/L) df['tag'] = df['D_HIGH_H'].str[-1] # 生成连续相同标签的分组ID:当当前行标签与上一行不同时,分组ID+1 df['group'] = (df['tag'] != df['tag'].shift()).cumsum() # 定义分组处理逻辑 def process_group(group_df): # 单一行的组直接保留 if len(group_df) == 1: return group_df # 获取当前组的标签类型 current_tag = group_df['tag'].iloc[0] # H组保留High最大值的行,L组保留High最小值的行 if current_tag == 'H': return group_df[group_df['High'] == group_df['High'].max()] elif current_tag == 'L': return group_df[group_df['High'] == group_df['High'].min()] # 对每个分组应用处理逻辑 result_df = df.groupby('group').apply(process_group).reset_index(drop=True) # 移除辅助列,保留原数据列 result_df = result_df.drop(['tag', 'group'], axis=1) # 输出格式化结果 print(result_df.to_string())
代码说明
- 提取标签:通过
str[-1]获取D_HIGH_H列的末尾H/L标识; - 分组连续序列:利用
shift()对比相邻行标签,结合cumsum()生成连续相同标签的分组ID,确保连续的H或L被分到同一组; - 分组处理:针对不同组类型(单一行、连续H、连续L)执行对应的保留规则;
- 输出结果:移除辅助列后输出符合要求的数据。
内容的提问来源于stack exchange,提问作者Yogesh Kamboj
相关产品推荐
相关产品推荐

