Тест Pandas повторного появления значения на основе периода прокатки - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь найти способ проверить, появился ли мой текущий row value - df['ColM'] в приведенном ниже кадре данных за 5-дневный период просмотра

import pandas as pd
import numpy as np

df = pd.DataFrame()

df['ColN'] = ['AAA', 'AAA', 'AAA', 'ABC', 'ABC', 'ABC', 'ABC', 'ABC']

df['ColM'] = ['XYZ', 'WUV', 'WUV', 'XYZ', 'WUV', 'WUV', 'OPQ', 'XYZ']

df['ColN_dt'] = ['03-12-2018', '03-13-2018', '03-16-2018', '03-18-2018', '03-22-2018', '03-23-2018', '03-26-2018', '03-30-2018']

Я пытаюсь увидеть, появлялось ли когда-либо значение строки для столбца ColM по группе ColN за последние 5 дней. я хочу создать флаг:

df['flag'] = [0, 0, 1, 0, 0, 1, 0, 0]

1 Ответ

0 голосов
/ 30 апреля 2018

Я думаю, вы можете создать столбец флага, используя groupby, если ваш df['ColN_dt'] является datetime Series:

# Set df['ColN_dt'] to datetime:
df['ColN_dt'] = pd.to_datetime(df['ColN_dt'])
# Make sure dates are sorted (they are in your example, but just in case)
df.sort_values('ColN_dt', inplace=True)
# Create your flag column
df['flag'] = (df.groupby(['ColN', 'ColM'])['ColN_dt']
              .apply(lambda x: x.diff() < pd.Timedelta(days=5))
              .astype(int))

Возвращает:

>>> df
  ColN ColM    ColN_dt  flag
0  AAA  XYZ 2018-03-12     0
1  AAA  WUV 2018-03-13     0
2  AAA  WUV 2018-03-16     1
3  ABC  XYZ 2018-03-18     0
4  ABC  WUV 2018-03-22     0
5  ABC  WUV 2018-03-23     1
6  ABC  OPQ 2018-03-26     0
7  ABC  XYZ 2018-03-30     0

Объяснение :

df.groupby(['ColN', 'ColM'])['ColN_dt']

Группирует ваш фрейм данных по ColN и ColM

.apply(lambda x: x.diff() < pd.Timedelta(days=5))

Проверяет, меньше ли разница между ['ColN_dt'] строки в каждой группе, чем 5 дней от строки выше. Это возвращает логическое значение, которое вы можете установить на int с помощью .astype(int)

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