首页 > 解决方案 > 如何让 pd.Grouper() 包含空组

问题描述

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

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

但这只会返回每个实际有数据A的月份。B我也希望每个月都没有数据AB组合。pd.Grouper()我在文档中没有看到这个选项。

标签: pythonpandas

解决方案


鉴于此数据框:

date        A  B
2018-01-01  1  3
2018-03-01  2  4

在 groupby 之后,您可以使用 resample 但为了重新采样,不幸的是您需要自己创建 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]

注意:用 [] 填充有点棘手,理想情况下你可以解决这个问题(通常不建议在 DataFrame 中使用列表)。


推荐阅读