我有一个数据集,我想按列和数据集中每个月的数据进行分组。我正在使用pd.Grouper()
作为每月的分组日期部分。
df.groupby(['A',pd.Grouper(key='date', freq='M')]).agg({'B':list})
但是,这仅返回每个实际有数据的A
,B
的月份。我还希望每个月都没有该A
,B
组合的数据。我没有在pd.Grouper()
文档中看到此选项。
答案 0 :(得分:3)
给出此数据框:
date A B
2018-01-01 1 3
2018-03-01 2 4
groupby之后,您可以使用重采样BUT来重采样unfortunately,您需要自己创建MultiIndex:
In [11]: res = df.groupby(['A',pd.Grouper(key='date', freq='M')]).agg({'B':list})
In [12]: m = pd.MultiIndex.from_product([df.A.unique(), pd.date_range(df.date.min(), df.date.max() + pd.offsets.MonthEnd(1), freq='M')])
In [13]: m
Out[13]:
MultiIndex(levels=[[1, 2], [2018-01-31 00:00:00, 2018-02-28 00:00:00, 2018-03-31 00:00:00]],
labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])
In [14]: res.reindex(m)
Out[14]:
B
1 2018-01-31 [3]
2018-02-28 NaN
2018-03-31 NaN
2 2018-01-31 NaN
2018-02-28 NaN
2018-03-31 [4]
注意:使用[]填充fillna有点棘手,理想情况下,您可以解决此问题(通常不建议在DataFrame中使用列表)。