如何获取pd.Grouper()以包括空组

时间:2019-01-24 21:41:53

标签: python pandas

我有一个数据集,我想按列和数据集中每个月的数据进行分组。我正在使用pd.Grouper()作为每月的分组日期部分。

df.groupby(['A',pd.Grouper(key='date', freq='M')]).agg({'B':list})

但是,这仅返回每个实际有数据的AB的月份。我还希望每个月都没有该AB组合的数据。我没有在pd.Grouper()文档中看到此选项。

1 个答案:

答案 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中使用列表)。