熊猫:在特定条件下对前N个元素求和

时间:2018-09-07 09:10:20

标签: 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            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分钟开始选择时间间隔,而不是计数(计数对我来说听起来更容易)。

有什么主意吗?预先谢谢你:)

1 个答案:

答案 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)