Счетчик скользящего временного окна Pandas с несколькими условиями - PullRequest
2 голосов
/ 25 сентября 2019

Итак, у меня есть такой фрейм данных:

A,B,C,D
foo,something,2019-01-04 09:56:01,True
bar,something,2019-01-05 8:15:09,True
bar,something,2019-01-05 10:15:10,False
bar,something,2019-01-07 10:15:10,False
baz,something,2019-02-07 10:15:38,True
bar,somethingelse,2019-02-09 11:42:16,False
foo,something,2019-05-04 11:44:56,True
foobar,something,2019-07-15 13:23:09,True
foo,something,2019-08-04 11:44:56,False
foobar,something,2019-08-05 13:23:09,False
foobarbaz,something,2019-08-05 13:23:10,True

И я хочу вычислить 2 новых столбца:

Во-первых, количество предыдущих отдельных значений «A» в пределахскользящее окно времени (скажем, 2 дня), где значение для «B» совпадает со значением рассматриваемой строки (включая рассматриваемую строку в подсчете).

Во-вторых, число предыдущихотдельные значения «A» в том же скользящем окне времени, где значение «B» совпадает со значением в текущей строке И значение «D» равно «True».

Требуемый выходтаким образом, будет:

A,B,C,D,F,G
foo,something,2019-01-04 09:56:01,True,1,1
bar,something,2019-01-05 8:15:09,True,2,2
bar,something,2019-01-05 10:15:10,False,2,2
bar,something,2019-01-07 10:15:10,False,1,1,0
baz,something,2019-02-07 10:15:38,True,1,1
bar,somethingelse,2019-02-09 11:42:16,False,1,0
foo,something,2019-05-04 11:44:56,True,1,1,1
foobar,something,2019-07-15 13:23:09,True,1,1
foo,something,2019-08-04 11:44:56,False,1,0
foobar,something,2019-08-05 13:23:09,False,2,0
foobarbaz,something,2019-08-05 13:23:10,True,3,1

Для первой части (вычислительный столбец F) мой ответ:

df["F"] = pd.factorize(df["A"])[0]
result = df.groupby("B").rolling("2D", on="C").F.apply(lambda x: len(np.unique(x)))

, который я затем могу повторно объединить в df на столбцах B иC (datetime в C все разные).Это дает желаемые результаты.

Но для столбца G я не могу найти решение.Фильтрация df (df.loc [df.D]) до применения тех же двух строк, что и выше, не является правильным решением, так как строка, где «D» - «Ложь», может иметь предыдущие строки, для которых это «Истина».».Выходные данные, полученные этим методом (после слияния), поэтому:

A,B,C,D,F,G
foo,something,2019-01-04 09:56:01,True,1,1
bar,something,2019-01-05 8:15:09,True,2,2
bar,something,2019-01-05 10:15:10,False,2,NaN
bar,something,2019-01-07 10:15:10,False,1,1,NaN
baz,something,2019-02-07 10:15:38,True,1,1
bar,somethingelse,2019-02-09 11:42:16,False,1,NaN
foo,something,2019-05-04 11:44:56,True,1,1
foobar,something,2019-07-15 13:23:09,True,1,1
foo,something,2019-08-04 11:44:56,False,1,NaN
foobar,something,2019-08-05 13:23:09,False,2,NaN
foobarbaz,something,2019-08-05 13:23:10,True,3,1

Значения, отличные от NaN, верны, но я не могу просто заполнить () эти NaN (сравнить с желаемым выходом), поэтомуподход кажется ошибочным.

Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...