首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何对一系列日期进行sum by > date,并将它们附加到pandas中新数据帧的新列中?

如何对一系列日期进行sum by > date,并将它们附加到pandas中新数据帧的新列中?
EN

Stack Overflow用户
提问于 2019-06-26 02:12:08
回答 3查看 62关注 0票数 3

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

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

但是我正在为循环的机制如何工作而苦苦挣扎,如果我只能使用一个带有聚合sum函数的for循环并让它遍历日期,那么它如何存储单个日期结果并将新列附加到新的dataframe中呢?

编辑:向数据集添加了更多信息,以使用例更清晰(希望如此)(请参阅: acct1),在此用例中,我希望它总是对给定帐户中所有行项目的到期日晚于从日期范围列表中测试的日期进行求和。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-26 03:06:16

您可以使用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
票数 3
EN

Stack Overflow用户

发布于 2019-06-26 02:31:01

您需要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
票数 0
EN

Stack Overflow用户

发布于 2019-06-26 08:44:08

使用joinpivot的另一种方法

(df[['abbrev','maturity']].join(df.sort_values(['abbrev','maturity'], ascending=False)
                                  .groupby(['abbrev'])
                                  .cumsum())
                          .pivot(index='abbrev', columns='maturity', values='amount')
                          .reindex(columns=accountDates)
                          .shift(-1, axis=1)
                          .bfill(1)
                          .fillna(0))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56759833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档