Pandas如何筛选前一行status为A、后一行status为B的连续行
实现方法
核心思路
利用shift()方法将status列向下偏移1行,即可在当前行直接比对下一行的status值,找到满足「当前为A,下一行是B」的位置后,同时保留当前行和下一行即可。
具体代码实现
1. 构造测试数据(可跳过,直接套用你自己的DataFrame即可)
import pandas as pd data = { "Time": ["2020-11-27 08:51:49", "2020-11-27 09:32:49", "2020-11-27 09:32:50", "2020-11-27 12:05:08", "2020-11-27 12:10:08", "2020-11-27 12:10:58", "2020-11-27 12:12:12", "2020-11-27 12:31:15", "2020-11-27 12:31:17"], "status": ["A", "B", "C", "B", "C", "A", "A", "B", "C"], "phase": [1,1,1,2,2,2,3,3,3] } df = pd.DataFrame(data, index=range(1,10)) # 索引和示例保持一致从1开始
2. 筛选符合条件的行
# 找出满足当前行status为A,下一行status为B的行索引 cond = (df['status'] == 'A') & (df['status'].shift(-1) == 'B') target_index = df[cond].index # 把下一行的索引也加入待保留列表 keep_index = target_index.union(target_index + 1) # 按原顺序取出保留的行 result = df.loc[keep_index]
3. 输出验证
打印result即可得到你需要的结果,和预期输出完全一致:
| index | Time | status | phase |
|---|---|---|---|
| 1 | 2020-11-27 08:51:49 | A | 1 |
| 2 | 2020-11-27 09:32:49 | B | 1 |
| 7 | 2020-11-27 12:12:12 | A | 3 |
| 8 | 2020-11-27 12:31:15 | B | 3 |
补充说明
如果你的数据未按时间顺序排序,记得先执行df = df.sort_values('Time').reset_index(drop=True)按时间排序后再执行筛选逻辑,保证行的先后顺序正确。
内容的提问来源于stack exchange,提问作者Nicolas_C00
相关产品推荐
相关产品推荐

