Pandas DataFrame находит ближайший индекс в предыдущих строках, где выполняется условие - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть следующий df1 фрейм данных:

    t       A
0   23:00   2
1   23:01   1
2   23:02   2
3   23:03   2
4   23:04   6
5   23:05   5
6   23:06   4
7   23:07   9
8   23:08   7
9   23:09   10
10  23:10   8

Для каждого t (приращения, упрощенные здесь, не распределенные равномерно в реальной жизни), я хотел бы найти, если таковые имеются, наиболее последнее время tr в течение предыдущих 5 минут, где A(t)- A(tr) >= 4. Я хочу получить:

    t       A    tr
0   23:00   2
1   23:01   1
2   23:02   2
3   23:03   2
4   23:04   6    23:03
5   23:05   5    23:01
6   23:06   4
7   23:07   9    23:06
8   23:08   7
9   23:09   10   23:06
10  23:10   8    23:06

В настоящее время я могу использовать shift(-1) для сравнения каждой строки с предыдущей строкой, например cond = df1['A'] >= df1['A'].shift(-1) + 4.

Как я могу смотреть дальше во времени?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Я добавил индекс datetime и использовал rolling(), который теперь включает функции временного окна за пределами простого окна индекса.

import pandas as pd
import numpy as np
import datetime

df1 = pd.DataFrame({'t' : [
        datetime.datetime(2020, 5, 17, 23, 0, 0),
        datetime.datetime(2020, 5, 17, 23, 0, 1),
        datetime.datetime(2020, 5, 17, 23, 0, 2),
        datetime.datetime(2020, 5, 17, 23, 0, 3),
        datetime.datetime(2020, 5, 17, 23, 0, 4),
        datetime.datetime(2020, 5, 17, 23, 0, 5),
        datetime.datetime(2020, 5, 17, 23, 0, 6),
        datetime.datetime(2020, 5, 17, 23, 0, 7),
        datetime.datetime(2020, 5, 17, 23, 0, 8),
        datetime.datetime(2020, 5, 17, 23, 0, 9),
        datetime.datetime(2020, 5, 17, 23, 0, 10)
        ], 'A' : [2,1,2,2,6,5,4,9,7,10,8]}, columns=['t', 'A'])
df1.index = df1['t']
df2 = df1
cond = df1['A'] >= df1.rolling('5s')['A'].apply(lambda x: x[0] + 4)
result = df1[cond]

Дает

t                         A
2020-05-17 23:00:04       6
2020-05-17 23:00:05       5
2020-05-17 23:00:07       9
2020-05-17 23:00:09      10
2020-05-17 23:00:10       8
0 голосов
/ 17 февраля 2020

Если ваши данные непрерывны по минутам, то вы можете сделать обычную смену:

df1['t'] = pd.to_timedelta(df1['t'].add(':00'))

df = pd.DataFrame({i:df1.A - df1.A.shift(i) >= 4 for i in range(1,5)})

df1['t'] - pd.to_timedelta('1min') * df.idxmax(axis=1).where(df.any(1))

Вывод:

0         NaT
1         NaT
2         NaT
3         NaT
4    23:03:00
5    23:01:00
6         NaT
7    23:06:00
8         NaT
9    23:06:00
10   23:06:00
dtype: timedelta64[ns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...