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
,谢谢!我仍然需要弄清楚它是否适用于我的整个数据帧,但看起来还可以