![](/img/trans.png)
[英]create ID column in dataframe based on other column values / Pandas -Python
[英]Python Pandas DataFrame: conditional column based on other column values
問題描述:
我正在嘗試模擬一台機器,如果在前 3 個時間步長中“VALUE”大於或等於 5,則其運行模式為“B”——這意味着“VALUE”>= 5 至少 3 分鍾。運行模式只要“VALUE”大於或等於 5,“B”在接下來的時間步長中保持為“B”,並且在至少 3 個時間步長后變為“A” - 這意味着操作模式“B”保持有效在接下來的 3 分鍾內。 3 分鍾后,如果“VALUE”小於 5,操作模式“A”將打開。
目標:
我需要一種使用 python 和 pandas 的方法,根據“VALUE”列中的值以及狀態“on”和“down”來識別“A”和“B”(列:“statusA/B”)描述的操作模式”(列:“VALUE<5 --> 下降,VALUE>=5 --> 上升”)。
必須考慮的條件如下:
我做了什么嘗試:
我嘗試了多種方法,將計數器應用於“向下”和“打開”的情況,並嘗試根據計數器值跟蹤狀態,但不幸的是它無法正常工作。
時間 | 價值 | VALUE<5 --> 下 / VALUE>=5 --> 上 | 狀態A/B |
---|---|---|---|
00:00 | 0 | 向下 | 一種 |
00:01 | 0 | 向下 | 一種 |
00:02 | 0 | 向下 | 一種 |
00:03 | 8個 | 在 | 一種 |
00:04 | 4個 | 向下 | 一種 |
00:05 | 2個 | 向下 | 一種 |
00:06 | 1個 | 向下 | 一種 |
00:07 | 2個 | 向下 | 一種 |
00:08 | 1個 | 向下 | 一種 |
00:08 | 5個 | 在 | 一種 |
00:09 | 6個 | 在 | 一種 |
00:10 | 0 | 向下 | 一種 |
00:11 | 10 | 在 | 一種 |
00:12 | 10 | 在 | 一種 |
00:13 | 10 | 在 | 一種 |
00:14 | 11 | 向下 | 乙 |
00:15 | 2個 | 向下 | 乙 |
00:16 | 1個 | 向下 | 乙 |
00:17 | 3個 | 向下 | 一種 |
00:18 | 11 | 在 | 一種 |
00:19 | 10 | 在 | 一種 |
00:20 | 10 | 在 | 一種 |
00:21 | 10 | 在 | 乙 |
00:22 | 10 | 在 | 乙 |
00:23 | 11 | 在 | 乙 |
00:24 | 14 | 在 | 乙 |
00:25 | 11 | 在 | 乙 |
修改后的解決方案。 由於親愛的mozway提出的一個微妙的觀點,我編輯了我的解決方案:
import pandas as pd
df2['status'] = df2['VALUE'].mask(df2['VALUE'].shift().rolling(3, min_periods=3).min() >= 5, 'B')
m1 = df2['status'].shift().eq('B')
m2 = df2['status'].shift(2).eq('B')
df2['status'] = (df2['status']
.mask(m1 | m2).fillna('B')
.astype(str)
.str.replace(r'\d+', 'A'))
m5 = df2['status'].shift().eq('B')
m6 = df2['status'].shift(2).eq('B')
m3 = df2['status'].eq('A')
m4 = df2.iloc[:, 2].eq('on')
df2['status'] = df2['status'].mask((m5 & m3 & m4) | (m6 & m3 & m4)).fillna('B')
index VALUE ... resulted statusA/B status
0 0 3 ... A A
1 1 5 ... A A
2 2 2 ... A A
3 3 6 ... A A
4 4 3 ... A A
5 5 1 ... A A
6 6 7 ... A A
7 7 7 ... A A
8 8 2 ... A A
9 9 2 ... A A
10 10 3 ... A A
11 11 6 ... A A
12 12 8 ... A A
13 13 8 ... A A
14 14 7 ... B B
15 15 4 ... B B
16 16 4 ... B B
17 17 6 ... A(expected is B because is "on" and at least 3... B
18 18 6 ... A(expected is B because is "on" and at least 3... B
19 19 6 ... A(expected is B because is "on" and at least 3... B
20 20 7 ... B B
21 21 2 ... B B
22 22 9 ... B B
23 23 8 ... A(expected is B because "B" keeps a "B" for 3 ... B
24 24 7 ... A(expected is B because is "on" and at least 3... B
25 25 2 ... B B
26 26 4 ... A(expected is B because "B" keeps a "B" for 3 ... B
27 27 4 ... A(expected is B because "B" keeps a "B" for 3 ... B
28 28 1 ... A(this true because it is down and the 3 time ... A
29 29 4 ... A A
[30 rows x 5 columns]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.