我有一个看起来像这样的数据框:
date condition count Value
01,01,2018 08:00 A 1 0
01,01,2018 08:01 A 2 1
01,01,2018 08:02 A 3 4
01,01,2018 08:03 B 1 2
01,01,2018 08:04 B 2 1
01,01,2018 08:05 B 3 7
01,01,2018 08:06 B 4 0
01,01,2018 08:07 C 1 11
01,01,2018 08:08 C 2 2
01,01,2018 08:09 C 3 0
01,01,2018 08:10 C 4 0
01,01,2018 08:11 C 5 0
01,01,2018 08:12 A 1 3
01,01,2018 08:13 A 2 1
01,01,2018 08:14 B 1 0
01,01,2018 08:15 B 2 0
01,01,2018 08:16 B 3 0
01,01,2018 08:17 C 1 8
在特定条件下,我正在尝试检查值的总和是否为0:
如果条件= B,则必须在从count = 1到count = 3的时间间隔内进行求和。 然后,如果此间隔的值的总和= 0,则称为error的另一列应给出值1。
在此示例中,sum = 10从08:03到08:05;并且sum从08:14到08:16 = 0。因此,在这种情况下,除了08:14到08:16之外,列错误中的值应全部为= 1,而它们应为= 1。
获取:
date condition count Value error
01,01,2018 08:00 A 1 0 0
01,01,2018 08:01 A 2 1 0
01,01,2018 08:02 A 3 4 0
01,01,2018 08:03 B 1 2 0
01,01,2018 08:04 B 2 1 0
01,01,2018 08:05 B 3 7 0
01,01,2018 08:06 B 4 0 0
01,01,2018 08:07 C 1 11 0
01,01,2018 08:08 C 2 2 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 3 0
01,01,2018 08:13 A 2 1 0
01,01,2018 08:14 B 1 0 1
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 8 0
我尝试过
df['error']=np.where((df['condition']==B) & (df['count']<=5) & (df['value'].sum==0), 1, 0)
或者是否/对于周期,但是我得到了错误。
在间隔中的每个错误值上或在间隔中的一行中只包含1个并没有多大关系,只要在那里出现1就足够了,以便我可以识别它。也许可以从条件B开始的前3分钟开始选择时间间隔,而不是计数(计数对我来说听起来更容易)。
有什么主意吗?预先谢谢你:)
答案 0 :(得分:1)
以下内容如何:
df['rolling'] = df['Value'].rolling(3).sum()
df['error'] = np.where((df['condition'] == 'B') & (df['count'].ge(3)),
df['rolling'].eq(0), np.nan)
df['error'] = np.where(df['condition'] == 'B',
df['error'].bfill(), 0)
这给您:
date condition count Value rolling error
01,01,2018 08:00 A 1 0 NaN 0.0
01,01,2018 08:01 A 2 1 NaN 0.0
01,01,2018 08:02 A 3 4 5.0 0.0
01,01,2018 08:03 B 1 2 7.0 0.0
01,01,2018 08:04 B 2 1 7.0 0.0
01,01,2018 08:05 B 3 7 10.0 0.0
01,01,2018 08:06 B 4 0 8.0 0.0
01,01,2018 08:07 C 1 11 18.0 0.0
01,01,2018 08:08 C 2 2 13.0 0.0
01,01,2018 08:09 C 3 0 13.0 0.0
01,01,2018 08:10 C 4 0 2.0 0.0
01,01,2018 08:11 C 5 0 0.0 0.0
01,01,2018 08:12 A 1 3 3.0 0.0
01,01,2018 08:13 A 2 1 4.0 0.0
01,01,2018 08:14 B 1 0 4.0 1.0
01,01,2018 08:15 B 2 0 1.0 1.0
01,01,2018 08:16 B 3 0 0.0 1.0
01,01,2018 08:17 C 1 8 8.0 0.0
如果您不想使用'rolling'
列,我们可以将其压缩为:
df['error'] = np.where((df['condition'] == 'B') & (df['count'].ge(3)),
df['Value'].rolling(3).sum().eq(0), np.nan)
df['error'] = np.where(df['condition'] == 'B',
df['error'].bfill(), 0)