如何按月对 pandas DataFrame 进行分组?尝试其输出具有实际最后几天的索引

How to group a pandas DataFrame by month? Trying its output to have a index with actual last days

我有以下DataFrame,喜欢按月分组。

import pandas as pd
import numpy as np

idx = pd.date_range(start='2001-01-01', end='2002-01-01', periods = 80)
df = pd.DataFrame(np.random.rand(160).reshape(80,2), index=idx.normalize(), columns=['a','b'])

使用以下代码,我可以按月对 df 进行分组,但其索引标签是每个 calendar[=38= 的最后几天] 月,但不是 df.

中每个月的最后几天
k = df.resample('M').apply(lambda x: x[-1])

k1 = df.groupby(pd.Grouper(freq='M')).last()

例如,df.loc['2001-01'].index[-1]Timestamp('2001-01-28 00:00:00'),而不是 Timestamp('2001-01-31 00:00:00')。但是,kk1 包括 2001-01-31,如下所示。

                   a         b
2001-01-31  0.521604  0.716046
2001-02-28  0.584479  0.560608
2001-03-31  0.201605  0.860491
2001-04-30  0.077426  0.711042
2001-05-31  0.544708  0.865880
2001-06-30  0.755516  0.863443
2001-07-31  0.266727  0.107859
2001-08-31  0.683754  0.098337
2001-09-30  0.586217  0.697163
2001-10-31  0.742394  0.160754
2001-11-30  0.655662  0.400128
2001-12-31  0.902192  0.580582
2002-01-31  0.878815  0.555669

换句话说,我喜欢按月对 df 进行分组,而分组的 dfdf 中包含每个月最后几天的索引标签,但不是最后一天每个日历月的日期。

让我们在 trim 索引

之后尝试 duplicated
df = df.sort_index()
out = df[~df.index.strftime('%Y-%m').duplicated(keep='last')]
Out[242]: 
                   a         b
2001-01-28  0.984408  0.923390
2001-02-25  0.108587  0.797240
2001-03-29  0.058016  0.025948
2001-04-26  0.095034  0.226460
2001-05-28  0.386954  0.419999
2001-06-30  0.535202  0.576777
2001-07-27  0.389711  0.706282
2001-08-29  0.270434  0.342087
2001-09-30  0.190336  0.872519
2001-10-28  0.333673  0.832585
2001-11-29  0.651579  0.751776
2001-12-27  0.649476  0.748410
2002-01-01  0.670143  0.389339

这个问题的答案很好。然而,如果你需要对组做更多的事情(例如,计算一些聚合统计数据)那么这里是另一个使用 groupby 方法的想法:

df = df.reset_index()
df.groupby([(df["index"].dt.year),(df["index"].dt.month)]).last().set_index("index")