如何实现Pandas中列值依次小于的通用高效筛选方法?
优化固定模式的DataFrame连续递增筛选逻辑
当前实现代码:
import pandas as pd dt = pd.DataFrame({ '1st':[1,0,1,0,1], '2nd':[2,1,2,1,2], '3rd':[3,0,3,2,3], '4th':[4,3,4,3,4], '5th':[5,0,5,4,5], 'minute_traded':[6,5,6,5,6] }) dt = dt[ (dt['1st'] < dt['2nd']) & (dt['2nd'] < dt['3rd']) & (dt['3rd'] < dt['4th']) & (dt['4th'] < dt['5th']) & (dt['5th'] < dt['minute_traded']) ] print(dt)
执行结果:
1st 2nd 3rd 4th 5th minute_traded 0 1 2 3 4 5 6 2 1 2 3 4 5 6 3 0 1 2 3 4 5 4 1 2 3 4 5 6
针对这种只需变更分析列的固定递增筛选场景,有两种更简洁的优化方案:
方案1:利用diff批量判断连续递增
通过提取需要校验的列序列,用diff计算相邻列的差值,再判断所有差值是否大于0,实现批量筛选:
import pandas as pd dt = pd.DataFrame({ '1st':[1,0,1,0,1], '2nd':[2,1,2,1,2], '3rd':[3,0,3,2,3], '4th':[4,3,4,3,4], '5th':[5,0,5,4,5], 'minute_traded':[6,5,6,5,6] }) # 只需修改这里的列列表即可切换分析目标 check_columns = ['1st', '2nd', '3rd', '4th', '5th', 'minute_traded'] # 计算相邻列的差值,过滤出所有连续递增的行 mask = dt[check_columns].diff(axis=1).iloc[:, 1:] > 0 dt_filtered = dt[mask.all(axis=1)] print(dt_filtered)
方案2:封装成函数,复用性更强
如果需要频繁切换分析列,把筛选逻辑封装成函数,调用时只需传入目标列列表:
import pandas as pd def filter_consecutive_increasing(df, column_sequence): # 计算相邻列的差值,确保每一列都严格小于下一列 diff_matrix = df[column_sequence].diff(axis=1).iloc[:, 1:] > 0 return df[diff_matrix.all(axis=1)] dt = pd.DataFrame({ '1st':[1,0,1,0,1], '2nd':[2,1,2,1,2], '3rd':[3,0,3,2,3], '4th':[4,3,4,3,4], '5th':[5,0,5,4,5], 'minute_traded':[6,5,6,5,6] }) # 调用函数时指定列序列即可 target_columns = ['1st', '2nd', '3rd', '4th', '5th', 'minute_traded'] dt_filtered = filter_consecutive_increasing(dt, target_columns) print(dt_filtered)
优化优势
- 灵活性高:修改分析列时只需调整列列表,无需逐行修改条件表达式
- 代码简洁:避免重复编写大量
(a < b) & (b < c)式的冗余代码 - 可扩展性强:支持任意长度的列序列,不管是5列还是更多列都能兼容
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

