2016-08-13 9 views
2

私は複数のインデックスを持つデータフレームを持っていますが、いくつかのデータのローリングサムを作成したいのですが、インデックスの各IDに対して作成します。パンダ:複数のインデックス(パネルデータ)のローリングサム

たとえば、私たちは、私は2つのインデックス(事務所)を持っていると私は名前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

はありがとうございました!私は大きなデータフレームをアンスタックするにはあまりにも多くのメモリを必要とするため、2番目のソリューションを使用します。クイックコメント、あなたは "レベル= 0"を説明できますか?数字0は何を参照していますか?特に私はさらに多くのインデックスでこれを複製したいからです。 –

+1

レベルゼロはインデックスの最初のレベルです。索引でグループ化する場合は、レベルが1つしかない場合でもレベルを指定する必要があります。そして、インデックスレベルでグループ化したいということをgroupbyに伝える唯一の方法です。 – piRSquared

+0

@ piRSquared-この情報をありがとう、これを動作させることに多くの問題があった。私にとって(私は思うが)それを固定したのはgroup_keysだった。これが何をしているのか説明できますか?これがなければ私はNaNのコラムを持っていました。ありがとうございました! –

関連する問題