我正在从Excel Countifs / Sum转变为Pandas。在Pandas中,我想对一些输入数据进行分组、分段和累积求和,然后将其作为输出表格写入CSV。
我的输入表格是每个项目发生的时间戳清单,例如:
import pandas as pd
df_in = pd.DataFrame({ 'Date' :[pd.Timestamp('20130101'),pd.Timestamp('20140101'),pd.Timestamp('20150101'),pd.Timestamp('20160101'),pd.Timestamp('20160101'),pd.Timestamp('20160101')],
'Type' : ['item1','item2','item2','item1','item1','item1'],
'Proj' : ['PJ1','PJ1','PJ1','PJ1','PJ2','PJ2']})
#giving
Proj Date Type
PJ1 2013-01-01 item1
PJ1 2014-01-01 item2
PJ1 2015-01-01 item2
PJ1 2016-01-01 item1
PJ2 2016-01-01 item1
PJ2 2016-01-01 item1
我希望能对每个项目的每种物品类型在一系列用户定义的时间窗口内进行累加(最终目标是获得每个项目在一段时间内实现的物品累积数量-例如,月份、季度、年等)。我的输出结果(分组到结束日期)应如下所示:
Proj Date_ item1 item2
PJ1 2014-01-01 1.0 1.0
PJ1 2016-01-01 2.0 2.0
PJ2 2014-01-01 0.0 0.0
PJ2 2016-01-01 2.0 0.0
这段代码可以工作,但看起来笨拙且需要循环。是否有更好的方法实现输出?也许是一些向量化的方法?此外,我始终希望保留输出的条目,即使其中有空数据 - 它们后面会被用于保持一致的绘图。
#prepare output table
df_out = pd.DataFrame({
'Date_' : [],
'Proj' : [],
'item1' : [],
'item2' : []})
#my time bins
bins = [pd.Timestamp('20121229'),pd.Timestamp('20140101'),pd.Timestamp('20160101')]
#group and bin data in a dataframe
groups = df_in.groupby(['Proj',pd.cut(df_in.Date, bins),'Type'])
allData = groups.count().unstack()
#list of projects in data
proj_list = list(set(df_in['Proj']))
#build output table by looping per project
for p in proj_list:
#cumulative sum of items achieved per project per bin
ProjData = allData.loc[p].fillna(0).cumsum()
#output should appear binned to the end date
ProjData=ProjData['Date'][:]
ProjData['Date_']=pd.IntervalIndex(ProjData.index.get_level_values('Date')).right
#include row wise project reference
ProjData['Proj']=p
#collapse the multi-dimensional dataframe for outputting
ProjData.reset_index(level=0, inplace=True)
ProjData.reset_index(level=0, inplace=True)
#build output table for export
df_out = df_out.append(ProjData[['Date_','Proj','item1','item2']])