熊猫找到下一行满足条件的连续行

时间:2021-06-25 01:26:46

标签: python pandas

所以我有一个看起来像这样的数据框:

<头>
index 时间 状态 阶段
1 2020-11-27 08:51:49 A 1
2 2020-11-27 09:32:49 B 1
3 2020-11-27 09:32:50 C 1
4 2020-11-27 12:05:08 B 2
5 2020-11-27 12:10:08 C 2
6 2020-11-27 12:10:58 A 2
7 2020-11-27 12:12:12 A 3
8 2020-11-27 12:31:15 B 3
9 2020-11-27 12:31:17 C 3

我只想过滤列 status = A 后跟 status = B 行的行 结果:

<头>
index 时间 状态 阶段
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

谢谢

2 个答案:

答案 0 :(得分:1)

尝试使用 groupbyshift

cond1 = df.groupby('phase')['status'].shift(-1).eq('B')  & df['status'].eq('A')
cond2 = df.groupby('phase')['status'].shift().eq('A')  & df['status'].eq('B')
df[cond1|cond2]
   index                Time status  phase
0      1  2020-11-2708:51:49      A      1
1      2  2020-11-2709:32:49      B      1
6      7  2020-11-2712:12:12      A      3
7      8  2020-11-2712:31:15      B      3

答案 1 :(得分:0)

df["next_status"] = df.status.shift(-1) 
df["prior_status"] = df.status.shift(1)
a = df.next_status.eq("B") & df.status.eq("A")
b = df.prior_status.eq("A") & df.status.eq("B")
df[a | b]

新列“next_status”是状态列,向上移动了一个。 因此,如果当前状态 = A 和以下状态 = B,它们将彼此相邻,同样的逻辑适用于先前状态。然后您可以使用条件对 df 进行子集化。