我有一个数据框,其中包括一个特定条件,一个条件连续发生次数的计数器以及一个特定值,如下所示:
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'
。
任何想法?预先感谢您的帮助!
答案 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