【问题标题】:Pandas extend index date using group byPandas 使用 group by 扩展索引日期
【发布时间】:2019-03-10 08:54:04
【问题描述】:

我有一系列类似这张表的交易:

ID  Customer    Date    Amount
1   A        6/12/2018  33,223.00
2   A        9/20/2018  635.00
3   B        8/3/2018   8,643.00
4   B        8/30/2018  1,231.00
5   C        5/29/2018  7,522.00

但是我需要获得过去六个月(截至今天)的平均金额

我正在使用

df.groupby('Customer').resample('W')['Amount'].sum()

得到这样的东西:

CustomerCode  PayDate   
A             2018-05-21                    268
              2018-05-28                   0.00
              2018-06-11                   0.00
              2018-06-18                472,657
              2018-06-25                   0.00

但是,使用此解决方案,我只能获得客户有金额的日期范围。我需要为每个客户延长周数,以便我可以获得六个月的整个范围(以周为单位)。在此示例中,我需要从“2018-04-05”这一周(从今天起正好是六个月前)到今天这一周(当然填充 0,因为没有金额)为客户 A /p>

【问题讨论】:

  • 我真的不明白你输出中的任何数字来自哪里
  • @user3483203 抱歉,但出于隐私考虑,我手动编写了它们,因此它们可能没有多大意义。但无论如何我都可以创建虚拟数据并提供它。

标签: python pandas date indexing


【解决方案1】:

这是我为我的问题找到的解决方案。首先,我创建了我想要的日期(过去六个月,但频率为几周)

dates = pd.date_range(datetime.date.today() - datetime.timedelta(6*365/12),
                      pd.datetime.today(),
                      freq='W')

然后我使用客户的产品和日期创建一个多索引。

multi_index = pd.MultiIndex.from_product([pd.Index(df['Customer'].unique()), 
                                          dates], 
                                         names=('Customer', 'Date'))

然后我使用新创建的多索引重新索引 df,最后,我用零填充缺失值。

df.reindex(multi_index)
df.fillna(0)

【讨论】:

    【解决方案2】:

    重采样非常灵活。要获得 6 个月的总和而不是当前的每周总和,您需要的只是:

    df.groupby('Customer').resample('6M')['Amount'].sum()
    

    按月末分组;月份开始是'6MS'

    有关可用频率的更多文档可在此处找到: http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多