簡體   English   中英

Python Pandas DataFrame:基於其他列值的條件列

[英]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 --> 上升”)。

必須考慮的條件如下:

  • 案例“A”和“B”相互依賴。
  • 如果先前發生至少 3 個“on”並且實際 VALUE 大於或等於 5,則發生情況“B”。
  • 一旦“B”發生,即使狀態為“down”,接下來的 3 個時間步也必須為“B”,只要“on”存在,它就會保持為“B”。

我做了什么嘗試
我嘗試了多種方法,將計數器應用於“向下”和“打開”的情況,並嘗試根據計數器值跟蹤狀態,但不幸的是它無法正常工作。

時間 價值 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM