代码之家  ›  专栏  ›  技术社区  ›  conv3d

如何使pd.Grouper()包含空组

  •  1
  • conv3d  · 技术社区  · 5 年前

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

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

    但这只返回每个月的时间 A , B 实际上有数据。我还希望每个月都有没有这方面的数据 , B pd.石斑鱼() 文档

    1 回复  |  直到 5 年前
        1
  •  3
  •   Andy Hayden    5 年前

    给定此数据帧:

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

    在groupby之后,您可以使用重采样,但为了重采样 unfortunately 您需要自己创建多索引:

    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]
    

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