我有一个类似以下内容的数据集:
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),在此用例中,我希望它总是对给定帐户中所有行项目的到期日晚于从日期范围列表中测试的日期进行求和。
发布于 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
发布于 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
发布于 2019-06-26 08:44:08
使用join
和pivot
的另一种方法
(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))
https://stackoverflow.com/questions/56759833
复制相似问题