按日期查找值并对它们求和

时间:2019-07-05 20:01:34

标签: python pandas dataframe

我有一些数据,格式为:

 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
       .        .      
       .        .      

最后,问题在于这需要花费大量时间才能完成并且没有产生任何结果。没有办法没有一种更容易,更简单的方法来执行此操作,但是我只是自己想不通。

1 个答案:

答案 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