我试图不定期地从熊猫数据框中对每月现金流进行分组:例如,在指数为[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
感谢您的帮助!
让
答案 0 :(得分:0)
丑陋而缓慢的方式,i
和map
可能不是最好的变量名......
可以使用apply
或df['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