Python 熊猫:在一定条件下对前N个元素求和
我有一个数据框,看起来像:Python 熊猫:在一定条件下对前N个元素求和,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个数据框,看起来像: 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
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,则必须在计数=1到计数=3的间隔内进行求和。
然后,如果该间隔的值之和=0,则另一个名为error的列的值应为1
在本例中,从08:03到08:05,sum=10;从08:14到08:16,和=0。因此,在这种情况下,列error中的值应该是all=0,除了08:14到08:16之外,它们应该是=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)
df['error']=np.其中((df['condition']==B)和(df['count']以下内容如何:
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
如果您不想使用“滚动”
列,我们可以将其压缩为:
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)
您还可以发布数据文件吗?很遗憾,我不能发布,它是机密文件。我创建此文件是为了提供一个示例。我复制粘贴了数据框并手动更改了示例的值,没有代码创建数据框,它来自一个导入的excel文件,带有时间和值。@sobek数据作为文本通常就足够了-使用StringIO
和pd。使用sep='\s+'
阅读\u csv
,谢谢!我仍然需要弄清楚它是否适用于我的整个数据帧,但看起来还可以