熊猫:只要条件持续存在并且某个值出现在另一列中,则为该列分配值

时间:2018-10-04 12:56:58

标签: python python-2.7 pandas

我有一个数据框,其中包括一个特定条件,一个条件连续发生次数的计数器以及一个特定值,如下所示:

         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

我想添加另一列“错误”,其条件为:
如果在value = 1时,如果value1 = 1并且condition = B,则只要value2 = 1,就分配错误= 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第二次出现时,value1永远不会等于1,因此即使value2 = 1也没有错误。

我尝试过类似的事情:

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

但是它给了我一个关键的错误,因为当列本身“还不存在”时,我在where条件中调用df['error'].shift(1)=='1'。 任何想法?预先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用:

#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