Панды: сумма первых N элементов при определенных условиях - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть датафрейм, похожий на:

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 при определенных условиях:

Сумма должна быть выполнена в интервале от count = 1 до count = 3, если условие = B. Тогда, если сумма значений такого интервала = 0, другой столбец с именем error должен дать значение 1.

В этом примере сумма = 10 с 08:03 до 08:05; и сумма = 0 с 08:14 до 08:16. Таким образом, в этом случае значения в ошибке столбца должны быть все = 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)

или если / для циклов, но я получаю ошибки.

На самом деле не имеет значения иметь 1 на каждое значение ошибки в интервале или только в одной строке в интервале, достаточно, чтобы где-то там была 1, чтобы я мог ее распознать. Возможно, интервал можно было бы выбрать, посмотрев на первые 3 минуты, когда начинается условие B, а не на счет (мне это просто кажется легче).

Есть идеи? Заранее спасибо:)

1 Ответ

0 голосов
/ 07 сентября 2018

Как насчет следующего:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...