Панды групповой отметки даты менее чем за n месяцев - PullRequest
0 голосов
/ 05 октября 2019

Так что в этом примере col1 имеет 2 разные категории. Как можно было бы вычислить те категории, которые удовлетворяют, если мы скажем n месяцев = 12, чтобы новый столбец отмечал категорию A как True, а cat B как false, поскольку она больше, чем n = 12 месяцев.

d_ex = pd.DataFrame({'col1': ['A', 'A', 'B', 'B', 'A'],
                     'col2': ['2019-01-01', '2018-02-01',
                             '2015-01-01', '2019-01-01', '2019-05-01']})

d_ex['col2'] = pd.to_datetime(d_ex['col2'])

Я пытался

d_ex.groupby(['col1'])['col2'].diff()

, но это не работает. Кроме того, может быть более двух вхождений категории, поэтому, если бы существовала третья категория A с датой 2015 года, я хотел бы, чтобы она помечалась как False, но два других по-прежнему действительны.

Я нашел это, но я не уверен, как изменить код, чтобы не использовать idxmax Вычисление разницы в датах в объекте Pandas GroupBy

Попытка получить решение, данное

(d_ex.groupby('col1')['col2'].diff().apply(lambda x: my_abs(x))
.apply(lambda x: set_condition(x)).bfill())

возвращает

0     True
1     True
2    False
3    False
4    False

, но индекс 4 должен быть True

1 Ответ

2 голосов
/ 05 октября 2019

Создание фрейма данных:

import pandas as pd

d_ex = pd.DataFrame({'col1': ['A', 'A', 'B', 'B', 'A'],
                     'col2': ['2019-01-01', '2018-02-01',
                              '2015-01-01', '2019-01-01', '2019-05-01']})

d_ex['col2'] = pd.to_datetime(d_ex['col2'])

# Sort the columns
d_ex.sort_values(['col1', 'col2'], inplace=True)

col1       col2
   A 2018-02-01
   A 2019-01-01
   A 2019-05-01
   B 2015-01-01
   B 2019-01-01

Разница по группам:

  • diff возвращает объект timedelta для каждой группы
    • NaT всегдадля первого вхождения в группе
d_ex['diff'] = d_ex.groupby('col1').diff()

col1       col2      diff
   A 2018-02-01       NaT
   A 2019-01-01  334 days
   A 2019-05-01  120 days
   B 2015-01-01       NaT
   B 2019-01-01 1461 days

Функция возврата абс различий

  • abs не работает на NaT, поэтому abs нельзя просто применить
  • Если вы используете sort_values на col1 и col2, этот шаг можно пропустить
def my_abs(x):
    try:
        x = abs(x)
    except TypeError:
        x = x
    return x

# Apply the function
d_ex['diff'] = d_ex['diff'].apply(lambda x: my_abs(x))

col1       col2      diff
   A 2018-02-01       NaT
   A 2019-01-01  334 days
   A 2019-05-01  120 days
   B 2015-01-01       NaT
   B 2019-01-01 1461 days

Функция для установки условия, Нет, если NaT

  • Из-за использования groupby и diff первая строка любой группы должна быть NaT
  • Set NaTв None, тогда это может быть backfilled
def set_condition(x):
    if type(x) == pd._libs.tslibs.nattype.NaTType:
        x = None
    elif x <= pd.Timedelta('365 days'):
        x = True
    else:
        x = False
    return x

# Apply the function
d_ex['condition'] = d_ex['diff'].apply(lambda x: set_condition(x))

col1       col2      diff condition
   A 2018-02-01       NaT      None
   A 2019-01-01  334 days      True
   A 2019-05-01  120 days      True
   B 2015-01-01       NaT      None
   B 2019-01-01 1461 days     False

Backfill None:

d_ex.condition.bfill(inplace=True)

col1       col2      diff  condition
   A 2018-02-01       NaT       True
   A 2019-01-01  334 days       True
   A 2019-05-01  120 days       True
   B 2015-01-01       NaT      False
   B 2019-01-01 1461 days      False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...