Как я могу сравнить два столбца даты с той же категорией в пандах

1

Я очень новичок в пандах, жалею, что не имею никакого смысла. У меня есть чувство, что группа по категории, но я не уверен, как запускать функции в groupby.

Я хочу найти даты из данной строки в Date1 и посмотреть, не будут ли даты (в дате 2) одного и того же идентификатора в течение 7 дней.

Я думал о разделении date1 и date2, но я не уверен, куда идти оттуда.

g1 = df[['Category', 'Date1']]

g2 = df[['Category', 'Date2']]

dif = pd.Timedelta(7, unit='D')
df['isDateWithin7Days'] = np.where((g1['Category'] == g2['Category'])(df['Date1'] > g2['Date2']-dif, True, False))

Я получаю эту ошибку

ValueError: операнды не могут быть переданы вместе с фигурами (50537,) (3,)

df1:

category        date1        date2      
  blue          1/1/2018     
  blue                       1/2/2018
  blue                       1/5/2018
  blue          2/1/2018
  green         1/3/2018     
  green                      1/1/2018
  red           12/1/2018
  red                        11/1/2018

Ожидаемые результаты:

category        date1        date2     isDateWithin7Days?      EarliestDate?
  blue          1/1/2018                      True             1/2/2018
  blue          2/1/2018                      False               0
  green         1/3/2018                      False               0
  red           12/1/2018                     False               0
  • 0
    Почему isDateWithin7Days? для green , 1/3/2018 False? Вы используете формат mm/dd/yyyy ?
  • 0
    зеленый - ложь, потому что 1 января 2008 года - до 3 января 2008 года. да это мм / дд / гггг
Теги:
pandas
group-by

1 ответ

2
Лучший ответ

IIUC, вы пытаетесь искать даты в date2 колонке, которые в течение 7 дней уникальной комбинации category и date1 - этот код возвращает True, если любые такие даты будут найдены, в противном случае возвращает значение False:

df['date1'] = pd.to_datetime(df['date1'], format = '%m-%d-%y')
df['date2'] = pd.to_datetime(df['date2'], format = '%m-%d-%y')

df1 = df.dropna(subset = ['date1']).drop(columns = ['date2'])
df2 = df.dropna(subset = ['date2']).drop(columns = ['date1'])

df3 = df1.merge(df2, on = 'category')
df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))

df3['isDateWithin7Days?'] = df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))
df3 = df3.groupby(['category', 'date1'])['isDateWithin7Days?'].sum().reset_index()
df3['isDateWithin7Days?'] = np.where(df3['isDateWithin7Days?'] > 0, True, False)

Выход:

  category      date1  isDateWithin7Days?
0     blue 2018-01-01                True
1     blue 2018-02-01               False
2    green 2018-01-03               False
3      red 2018-12-01               False
  • 0
    Как я могу получить минимальное значение даты вместо True или False?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню