使用熊猫按月定制分组

时间:2015-08-07 14:14:23

标签: python pandas

我试图不定期地从熊猫数据框中对每月现金流进行分组:例如,在指数为[4,9,12]的月末。 我一直在使用pd.groupby()和pd.resample(),但无法找出有效的语法。

import datetime as dt
import pandas as pd
import numpy as np

index = pd.date_range(dt.datetime(2015, 1, 1), periods=12, freq='M')
data = (10 * np.random.rand(12)).round()
df = pd.DataFrame(data, index = index, columns = ['A'])

print df

基本上,从列表[4,9,12],我正在寻找一种语法,将月份1-4,5-9和10-12加在一起。例如,从下面的A列开始,我希望得到列B或C,并且这些给定月份的运行总和结束:

            A  B   C
2015-01-31  9  9   0
2015-02-28  7  16  0
2015-03-31  5  21  0
2015-04-30  4  25  25
2015-05-31  6  6   0
2015-06-30  8  14  0
2015-07-31  2  16  0
2015-08-31  7  23  0
2015-09-30  0  23  23
2015-10-31  5  5   0
2015-11-30  5  10  0
2015-12-31  8  18  18

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

丑陋而缓慢的方式,imap可能不是最好的变量名......

可以使用applydf['B'] = 0 for index, i in enumerate(df.index): if i.month in [4, 9, 12]: df['B'][i] = sum(df['A'][index - 3:index + 1].tolist()) print df A B 2015-01-31 9 0 2015-02-28 8 0 2015-03-31 4 0 2015-04-30 7 28 2015-05-31 4 0 2015-06-30 4 0 2015-07-31 2 0 2015-08-31 5 0 2015-09-30 8 19 2015-10-31 5 0 2015-11-30 0 0 2015-12-31 4 17 进行改进。

{{1}}

答案 1 :(得分:0)

使用一些字符串格式来获取索引,但适用于任何月份组合(只要明确包含第一个月)。

它避免遍历完整的Pandas数据帧,仅在所需的几个月内循环。

year = 2015                                                                      
months = [1, 4, 9, 12]                                                               
for num, month in enumerate(months[:-1]):                                        
    csum = df['{0}-{1}'.format(year, month):'{0}-{1}'.format(                    
        year,months[num+1]-1)].A.sum()                                           
    df.loc['{0}-{1}'.format(year,months[num+1]), 'B'] = csum                   

print(df)

            A   B                                                                 
2015-01-31  5 NaN
2015-02-28  1 NaN
2015-03-31  3 NaN
2015-04-30  7   9
2015-05-31  6 NaN
2015-06-30  9 NaN
2015-07-31  4 NaN
2015-08-31  4 NaN
2015-09-30  9  30
2015-10-31  3 NaN
2015-11-30  0 NaN
2015-12-31  9  12