如何将日期范围的日期相加并将它们附加到pandas中新数据框中的新列?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (138)

我有一个类似于以下内容的数据集:

abbrev    amount    maturity
acct1     100       6/2/2019
acct1     500       6/3/2019
acct1     1100      6/5/2019
acct2     200       6/3/2019
acct3     1000      6/4/2019
acct4     2500      6/5/2019

我想要做的是有一个列表或日期范围。我尝试了以下方法:

accountDates = pd.date_range(start='6/1/2019', end='6/5/2019')

然后我想逐个循环遍历日期范围,并在成熟度大于日期时获得总和。例如,如果成熟度>'6/1/2019',acct1将总计为1200.理想情况下,我希望将此信息存储在如下所示的新数据框中:

abbrev    6/1/2019    6/2/2019    6/3/2019    6/4/2019    6/5/2019
acct1     1700        1600        1100        1100        0
acct2     200         200         0           0           0
acct3     1000        1000        1000        0           0
acct4     2500        2500        2500        2500        0

但我正在努力解决循环的机制如何工作,如果我能够使用带有聚合求和函数的for循环并让它经历日期,那么它将如何存储单个日期结果并将新列附加到新数据框?

编辑:向数据集添加了一些更多信息,以便更清楚(希望)用例(请参阅:acct1),我希望它总是对给定帐户中的所有内容进行求和,该帐户的成熟度大于其从日期开始测试的日期范围清单。

提问于
用户回答回答于

您可以使用pivot_table,然后reindex将您的日期列表反转并使用cumsum加号shift来获得一天的总和。然后再按reindex正确顺序列出日期列表。

print (df.pivot_table(values='amount', index='abbrev', 
                      columns='maturity', aggfunc=sum, fill_value=0)
          .reindex(columns=accountDates[::-1])
          .cumsum(axis=1)
          .shift(axis=1)
          .reindex(columns=accountDates)
          .fillna(0))
       2019-06-01  2019-06-02  2019-06-03  2019-06-04  2019-06-05
abbrev                                                            
acct1       1700.0      1600.0      1100.0      1100.0         0.0
acct2        200.0       200.0         0.0         0.0         0.0
acct3       1000.0      1000.0      1000.0         0.0         0.0
acct4       2500.0      2500.0      2500.0      2500.0         0.0
用户回答回答于

你需要groupby然后pivot_table

df['maturity'] = df['maturity'] - pd.Timedelta(days=1)
mdata = df.groupby(['maturity', 'abbrev']).sum().reset_index(1).reindex(accountDates)
pdf = pd.pivot_table(mdata.dropna(), index='abbrev', columns=mdata.dropna().index).bfill(1).fillna(0)

输出:

       amount                                 
       2019-06-01 2019-06-02 2019-06-03 2019-06-04
abbrev                                            
acct1      1200.0        0.0        0.0        0.0
acct2       200.0      200.0        0.0        0.0
acct3      1000.0     1000.0     1000.0        0.0
acct4      2500.0     2500.0     2500.0     2500.0

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励