我有一个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
的值,因为这些日期是每个月的最高值。我希望得到groupby
期间这些日期的qty & val
的总和。或者只是按date
分组,然后只选择date
最后日期的值,但我认为先删除不需要的数据更有效。
我试着使用:
group = df.groupby('date')
group_max = groups.apply(lambda g: g[g['date'] == g['date'].max()])
但是如果运气不好,我该如何在分组之前或之后进行过滤,以便我只能获得date
中每个月最后日期的值?
您可以使用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