pandas筛选DataFrame行时如何编写前置连续行判断条件
实现代码
second_condition可以通过序列移位判断前置连续行的匹配情况实现,完整可运行代码如下:
import pandas as pd # 构造示例DataFrame,索引匹配题目展示的1~8序号 dataframe = pd.DataFrame( { 'first': [2, 2, 3, 4, 5, 8, 3, 5], 'second': [2, 1, 4, 6, 4, 8, 4, 6], 'third': [1, 0, 5, 3, 3, 4, 2, 6] }, index=range(1, 9) ) # 定义second_condition s = dataframe['third'] < dataframe['second'] # 连续2行满足的情况:前2行全满足,前第3行(若存在)不满足 cond_k2 = s.shift(1, fill_value=False) & s.shift(2, fill_value=False) & (~s.shift(3, fill_value=False)) # 连续3行满足的情况:前3行全满足,前第4行(若存在)不满足 cond_k3 = s.shift(1, fill_value=False) & s.shift(2, fill_value=False) & s.shift(3, fill_value=False) & (~s.shift(4, fill_value=False)) # 连续4行满足的情况:前4行全满足,前第5行(若存在)不满足 cond_k4 = s.shift(1, fill_value=False) & s.shift(2, fill_value=False) & s.shift(3, fill_value=False) & s.shift(4, fill_value=False) & (~s.shift(5, fill_value=False)) second_condition = cond_k2 | cond_k3 | cond_k4 # 执行筛选 res_index = dataframe[(dataframe['first'] < dataframe['second']) & (second_condition)].index print(res_index) # 输出 Int64Index([3, 7, 8], dtype='int64'),完全匹配预期结果
逻辑说明
- 先逐行生成基础布尔序列
s,标记每行是否满足third < second - 借助
pandas.Series.shift()方法将序列向后偏移,直接取当前行往前数第n行的判断结果,不存在前置行的边界位置统一填充False - 分别校验连续长度为2、3、4三种合法区间的情况:要求对应数量的紧邻前置行全部满足
s=True,且更靠前1行(如果存在)满足s=False,避免把长度超过4的连续片段误判 - 三种合法情况取或运算,得到最终的第二个筛选条件
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

