2016-08-13 64 views
2

我有一个数据框与多个索引,并希望创建一些数据的滚动总和,但索引中的每个ID。熊猫:与多个索引滚动和(即面板数据)

例如,让我们说我有两个指标(商行),我有名字ZDATA一些数据。下面的工作示例如下:

import pandas as pd 

# generating data 
firms = ['firm1']*5+['firm2']*5 
years = [2000+i for i in range(5)]*2 
zdata = [1 for i in range(10)] 

# Creating the dataframe 
mydf = pd.DataFrame({'firms':firms,'year':years,'zdata':zdata}) 

# Setting the two indexes 
mydf.set_index(['firms','year'],inplace=True) 

print(mydf) 
      zdata 
firms year  
firm1 2000  1 
     2001  1 
     2002  1 
     2003  1 
     2004  1 
firm2 2000  1 
     2001  1 
     2002  1 
     2003  1 
     2004  1 

现在,我想要为每个公司开始滚动的总和。但是,如果我输入

new_rolling_df=mydf.rolling(window=2).sum() 

print(new_rolling_df) 
       zdata 
    firms year  
    firm1 2000 NaN 
     2001 2.0 
     2002 2.0 
     2003 2.0 
     2004 2.0 
    firm2 2000 2.0 
     2001 2.0 
     2002 2.0 
     2003 2.0 
     2004 2.0 

它没有考虑到多重指数,只是做出正常的滚动总和。任何人有一个想法,我应该怎么办(尤其是因为我比2(公司,员工,国家,一年甚至更多的索引)

感谢,

阿德里安

回答

2

选项1

mydf.unstack(0).rolling(2).sum().stack().swaplevel(0, 1).sort_index() 

enter image description here

选项2

mydf.groupby(level=0, group_keys=False).rolling(2).sum() 

enter image description here

+0

太谢谢你了!我将使用第二种解决方案,因为它需要太多的内存来卸载我拥有的大型数据框。快速评论,你能解释一下“level = 0”吗?数字0指的是什么?特别是因为我想用更多的索引来复制它。 –

+1

零级是索引的第一级。如果按索引分组,则即使只有一个级别,也必须指定级别。而且,这是告诉groupby我想按索引级别分组的唯一方法。 – piRSquared

+0

@ piRSquared-感谢您提供这方面的信息,让这项工作很困难。对我来说(我认为)是修正它的group_keys。你能解释一下这是什么吗?没有这个,我有一列NaNs。再次感谢你! –