Панды: присваивать значения столбцу, пока сохраняется условие и определенное значение появляется в другом столбце - PullRequest
0 голосов
/ 04 октября 2018

У меня есть фрейм данных, включающий определенное условие, счетчик количества последовательных повторений условия и определенное значение, которое выглядит следующим образом:

         date                condition         count        Value1    Value2
    01,01,2018 08:00             A               1            0         0
    01,01,2018 08:01             A               2            0         0
    01,01,2018 08:02             A               3            0         0
    01,01,2018 08:03             B               1            1         1
    01,01,2018 08:04             B               2            0         1
    01,01,2018 08:05             B               3            0         1
    01,01,2018 08:06             B               4            0         0
    01,01,2018 08:07             C               1            0         0
    01,01,2018 08:08             C               2            0         0
    01,01,2018 08:09             C               3            0         0
    01,01,2018 08:10             C               4            0         0
    01,01,2018 08:11             C               5            0         0
    01,01,2018 08:12             A               1            0         0
    01,01,2018 08:13             A               2            0         0
    01,01,2018 08:14             B               1            0         0
    01,01,2018 08:15             B               2            0         1
    01,01,2018 08:16             B               3            0         1
    01,01,2018 08:17             C               1            0         0

Я хотел бы добавить еще один столбец "error ", которая имеет значение 1 при условии:
, если value1 = 1 и условие = B, когда count = 1, тогда присваивайте error = 1, пока значение2 = 1.

Это должно выглядеть следующим образом:

         date                condition         count        Value1    Value2    error 
    01,01,2018 08:00             A               1            0         0        0
    01,01,2018 08:01             A               2            0         0        0
    01,01,2018 08:02             A               3            0         0        0
    01,01,2018 08:03             B               1            1         1        1
    01,01,2018 08:04             B               2            0         1        1
    01,01,2018 08:05             B               3            0         1        1
    01,01,2018 08:06             B               4            0         0        0
    01,01,2018 08:07             C               1            0         0        0
    01,01,2018 08:08             C               2            0         0        0
    01,01,2018 08:09             C               3            0         0        0
    01,01,2018 08:10             C               4            0         0        0
    01,01,2018 08:11             C               5            0         0        0
    01,01,2018 08:12             A               1            0         0        0
    01,01,2018 08:13             A               2            0         0        0
    01,01,2018 08:14             B               1            0         0        0
    01,01,2018 08:15             B               2            0         1        0
    01,01,2018 08:16             B               3            0         1        0
    01,01,2018 08:17             C               1            0         0        0

Обратите внимание, что во второй раз, когда возникает условие B, значение1 никогда не становится равным 1, поэтому даже если значение2 = 1, ошибки нет.

Я пробовал что-то вроде:

df['error']=np.where(((df['value1']==1) & (df['condition']=='B') & df['value2']==1)) | ((df['error'].shift(1)=='1')&(df['value2']==1))),'1', 0)

но это дает мне ключевую ошибку, потому что я вызываю df['error'].shift(1)=='1' в условиях where, а сам столбец "еще не существует".Любая идея?заранее благодарю за помощь!

1 Ответ

0 голосов
/ 04 октября 2018

Использование:

#conditions
mask = (df['Value1']==1) & (df['condition']=='B') & (df['Value2']==1)
#series for unique consecutive values
a = df['Value2'].ne(df['Value2'].shift()).cumsum()
#per each consecutive group cal cumulative sum, convert to boolean and then to integers
df['error'] = mask.groupby(a).cumsum().astype(bool).astype(int)
print (df)
                date condition  count  Value1  Value2  error
0   01,01,2018 08:00         A      1       0       0      0
1   01,01,2018 08:01         A      2       0       0      0
2   01,01,2018 08:02         A      3       0       0      0
3   01,01,2018 08:03         B      1       1       1      1
4   01,01,2018 08:04         B      2       0       1      1
5   01,01,2018 08:05         B      3       0       1      1
6   01,01,2018 08:06         B      4       0       0      0
7   01,01,2018 08:07         C      1       0       0      0
8   01,01,2018 08:08         C      2       0       0      0
9   01,01,2018 08:09         C      3       0       0      0
10  01,01,2018 08:10         C      4       0       0      0
11  01,01,2018 08:11         C      5       0       0      0
12  01,01,2018 08:12         A      1       0       0      0
13  01,01,2018 08:13         A      2       0       0      0
14  01,01,2018 08:14         B      1       0       0      0
15  01,01,2018 08:15         B      2       0       1      0
16  01,01,2018 08:16         B      3       0       1      0
17  01,01,2018 08:17         C      1       0       0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...