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

#python #pandas #group-by

Вопрос:

У меня есть df

 qty         val         date
10          100         2021-09-15
11          111         2021-09-22
20          222         2021-09-22
35          333         2021-09-15
45          444         2021-10-15
79          555         2021-10-15
79          555         2021-10-07
87          666         2021-11-15
45          777         2021-11-15
97          888         2021-11-22
 

Я пытаюсь сгруппировать значения по max(date) каждому месяцу, поэтому я бы взял значения только 2021-09-22 / 2021-10-15 / 2021-11-22 потому, что эти даты являются самыми высокими в каждом месяце. Я ожидал бы получить сумму qty amp; val за эти даты во groupby время . Или просто сгруппируйте, date а затем выберите только значения последней даты date , но я предполагаю, что сначала более эффективно удалить ненужные данные.

Я пытался использовать:

 group = df.groupby('date')
group_max = groups.apply(lambda g: g[g['date'] == g['date'].max()])
 

Но если не повезет, как бы я отфильтровал до или после группировки, чтобы я получал только значения последних дат каждого месяца в a date ?

Комментарии:

1. какого типа столбец даты? строка или дата по времени?

2. Это дата-время, заранее я использую df.date = pd.to_datetime(df.date)

Ответ №1:

Вы можете использовать pandas.Grouper :

 # pre-requisite
df['date'] = pd.to_datetime(df['date'])

g = df.groupby(pd.Grouper(freq='M', key='date'))
df[df['date'].eq(g['date'].transform('max'))]
 

выход:

    qty  val       date
1   11  111 2021-09-22
2   20  222 2021-09-22
4   45  444 2021-10-15
5   79  555 2021-10-15
9   97  888 2021-11-22