所以我有一个看起来像这样的数据框:
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 |
谢谢
答案 0 :(得分:1)
尝试使用 groupby
和 shift
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 进行子集化。