如何按月对 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')
。但是,k
和 k1
包括 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
进行分组,而分组的 df
在 df
中包含每个月最后几天的索引标签,但不是最后一天每个日历月的日期。
让我们在 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")
我有以下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')
。但是,k
和 k1
包括 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
进行分组,而分组的 df
在 df
中包含每个月最后几天的索引标签,但不是最后一天每个日历月的日期。
让我们在 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")