2016-08-13 65 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。再次感謝你! –