在 pandas 系列中查找值从一个特定值变为另一个特定值的位置

finding places in a pandas series where the value changes from one specific value to another

我已经尝试了好几个小时来找到解决这个问题的方法并且到了最后期限所以我希望我能在这里找到救赎: 我有一个系列,其中包含几个可选字符串作为表示住院期间所用药物状态的值:'virgin', 'start', 'on', 'off', 'prev' 例如:

time                   value

2007-04-10 13:06:00    virgin
2007-04-10 13:07:00    virgin
2007-04-10 13:08:00     start
2007-04-10 13:09:00        on
2007-04-10 13:10:00        on
2007-04-10 13:11:00        on
2007-04-10 13:12:00        on
2007-04-10 13:13:00        on
2007-04-10 13:14:00        on
2007-04-10 13:15:00        on
2007-04-10 13:16:00        on
2007-04-10 13:17:00        on
2007-04-10 13:18:00        on
2007-04-10 13:19:00        on
2007-04-10 13:20:00        on
2007-04-10 13:21:00        on
2007-04-10 13:22:00        on
2007-04-10 13:23:00        on
2007-04-10 13:24:00        on
2007-04-10 13:25:00        on
2007-04-10 13:26:00        on
2007-04-10 13:27:00        on
2007-04-10 13:28:00        on
2007-04-10 13:29:00        on
2007-04-10 13:30:00        on
2007-04-10 13:31:00        on
2007-04-10 13:32:00        on
2007-04-10 13:33:00        off
2007-04-10 13:34:00        off
2007-04-10 13:35:00        off
                        ...  
2007-04-19 15:06:00      prev
2007-04-19 15:07:00      prev
2007-04-19 15:08:00      prev

我需要做的是找到df['value] == 'on'后面跟df['value] == 'off'的地方,这样我就可以把那个地方的值改成'stop'.

找遍了都没有找到解决办法,这里也没有找到符合这个需求的问题。如果您知道这样的问题 - 请 - 不要投反对票 - 只需指出正确的方向 - 我觉得我已经尽一切努力在发布之前解决这个问题。

谢谢!

IIUC 然后你可以结合你的布尔条件并使用 shift 来测试前一行值:

In [44]:
df['state_stop'] = (df['value']=='off') & (df['value'].shift() =='on')
df

Out[44]:
                  time   value state_stop
0  2007-04-10 13:06:00  virgin      False
1  2007-04-10 13:07:00  virgin      False
2  2007-04-10 13:08:00   start      False
3  2007-04-10 13:09:00      on      False
4  2007-04-10 13:10:00      on      False
5  2007-04-10 13:11:00      on      False
6  2007-04-10 13:12:00      on      False
7  2007-04-10 13:13:00      on      False
8  2007-04-10 13:14:00      on      False
9  2007-04-10 13:15:00      on      False
10 2007-04-10 13:16:00      on      False
11 2007-04-10 13:17:00      on      False
12 2007-04-10 13:18:00      on      False
13 2007-04-10 13:19:00      on      False
14 2007-04-10 13:20:00      on      False
15 2007-04-10 13:21:00      on      False
16 2007-04-10 13:22:00      on      False
17 2007-04-10 13:23:00      on      False
18 2007-04-10 13:24:00      on      False
19 2007-04-10 13:25:00      on      False
20 2007-04-10 13:26:00      on      False
21 2007-04-10 13:27:00      on      False
22 2007-04-10 13:28:00      on      False
23 2007-04-10 13:29:00      on      False
24 2007-04-10 13:30:00      on      False
25 2007-04-10 13:31:00      on      False
26 2007-04-10 13:32:00      on      False
27 2007-04-10 13:33:00     off       True
28 2007-04-10 13:34:00     off      False
29 2007-04-10 13:35:00     off      False
30 2007-04-19 15:06:00    prev      False
31 2007-04-19 15:07:00    prev      False
32 2007-04-19 15:08:00    prev      False

因此,由于运算符优先级,这使用 & 将您的 2 个布尔条件组合在括号中,并使用 shift 测试前一行,如您所见,条目 27 2007-04-10 13:33:00 off True 设置为True 根据需要,可以将语句修改为:

In [47]:
df.loc[(df['value']=='off') & (df['value'].shift() =='on'), 'value'] = 'stop'
df

Out[47]:
                  time   value
0  2007-04-10 13:06:00  virgin
1  2007-04-10 13:07:00  virgin
2  2007-04-10 13:08:00   start
3  2007-04-10 13:09:00      on
4  2007-04-10 13:10:00      on
5  2007-04-10 13:11:00      on
6  2007-04-10 13:12:00      on
7  2007-04-10 13:13:00      on
8  2007-04-10 13:14:00      on
9  2007-04-10 13:15:00      on
10 2007-04-10 13:16:00      on
11 2007-04-10 13:17:00      on
12 2007-04-10 13:18:00      on
13 2007-04-10 13:19:00      on
14 2007-04-10 13:20:00      on
15 2007-04-10 13:21:00      on
16 2007-04-10 13:22:00      on
17 2007-04-10 13:23:00      on
18 2007-04-10 13:24:00      on
19 2007-04-10 13:25:00      on
20 2007-04-10 13:26:00      on
21 2007-04-10 13:27:00      on
22 2007-04-10 13:28:00      on
23 2007-04-10 13:29:00      on
24 2007-04-10 13:30:00      on
25 2007-04-10 13:31:00      on
26 2007-04-10 13:32:00      on
27 2007-04-10 13:33:00    stop
28 2007-04-10 13:34:00     off
29 2007-04-10 13:35:00     off
30 2007-04-19 15:06:00    prev
31 2007-04-19 15:07:00    prev
32 2007-04-19 15:08:00    prev