我有一些数据,格式为:
date_1 date_2 date_3 pay_1 pay_2 pay_3
2017-03 2017-04 2017-05 115.3 110.5 115.7
2018-03 NaT NaT 98.2 nan nan
2017-08 2017-09 NaT 200.0 200.0 nan
. . . . . .
. . . . . .
其中数据列最初位于datetime64
中,而我变成了字符串,而支付列位于int
中。索引是唯一的格式化数字。我确保它们是唯一的。
所以,我需要知道自基准开始日期以来每个月支付了多少钱。这是我尝试过的:
group = pd.DataFrame(); group['dates']= sp.date_hw().astype(str); group['paid'] = 0
col_array = df_hw.columns
for i in range(len(group)):
for j in range(len(ind_array)):
for k in range(3):
if '-'.join(df_hw.loc[ind_array[j]][col_array[k]].split('-')[:-1]) == group.loc[i]['dates']:
group.loc[i]['paid'] = group.loc[i]['paid'] + df_hw.loc[ind_array[j]][col_array[k]+15]
基本上,group
数据帧是应存储我的结果的位置,预期输出为:
dates paid
2015-01 11452.43
2015-02 9326.32
2015-03 14398.95
. .
. .
最后,问题在于这需要花费大量时间才能完成并且没有产生任何结果。没有办法没有一种更容易,更简单的方法来执行此操作,但是我只是自己想不通。
答案 0 :(得分:2)
首先用pd.wide_to_long
重塑形状,然后groupby.sum
就可以了。
res = pd.wide_to_long(df.reset_index(), stubnames=['date', 'pay'],
sep='_', i='index', j='num')
res.groupby('date').sum()
pay
date
2017-03 115.3
2017-04 110.5
2017-05 115.7
2017-08 200.0
2017-09 200.0
2018-03 98.2
NaT 0.0
或者,保留完整的datetime64
(甚至包括天数),并使用PeriodIndex
对整形后的月份进行分组。
res = pd.wide_to_long(df.reset_index(), stubnames=['date', 'pay'],
sep='_', i='index', j='num')
res.groupby(pd.PeriodIndex(res.date, freq='M')).sum()
pay
date
2017-03 115.3
2017-04 110.5
2017-05 115.7
2017-08 200.0
2017-09 200.0
2018-03 98.2