#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