2016-09-09 11 views
4

どこから始めるべきか分かりません。複雑なピボットとリサンプル

これは私のデータの初期形状である:

df = pd.DataFrame({ 
    'Year-Mth': ['1900-01' 
       ,'1901-02' 
       ,'1903-02' 
       ,'1903-03' 
       ,'1903-04' 
       ,'1911-08' 
       ,'1911-09'], 
    'Category': ['A','A','B','B','B','B','B'], 
    'SubCategory': ['X','Y','Y','Y','Z','Q','Y'], 
    'counter': [1,1,1,1,1,1,1] 
}) 

df 

これは私が取得したいのですが、結果である - 以下の4年間のバケットにリサンプリングされた中で、第M-年:

enter image description here

可能であれば、私は 'Year-Mth'を再サンプリング可能にするプロセスでこれを行いたいので、別のバケットに簡単に切り替えることができます。ここで

答えて

3
cols = [df.SubCategory, pd.to_datetime(df['Year-Mth']), df.Category] 
df1 = df.set_index(cols).counter 

df1.unstack('Year-Mth').T.resample('60M', how='sum').stack(0).swaplevel(0, 1).sort_index().fillna('') 

enter image description here

+4

ayhanの答えと比較して、このアプローチを「データフレームをルービックス」と呼ぼう – Boud

+1

@Boudは私に良い笑いを与えました...あまりにも真実です! – piRSquared

+2

なぜ60M? 5Aを使用するのと同じか、または5Aを使用するために他のコードを修正する必要がありますか? – whytheq

5

は私の試みです:

df['Year'] = pd.cut(df['Year-Mth'].str[:4].astype(int), 
        bins=np.arange(1900, 1920, 5), right=False) 
df.pivot_table(index=['SubCategory', 'Year'], columns='Category', 
       values='counter', aggfunc='sum').dropna(how='all').fillna(0) 
Out: 
Category     A B 
SubCategory Year     
Q   [1910, 1915) 0.0 1.0 
X   [1900, 1905) 1.0 0.0 
Y   [1900, 1905) 1.0 2.0 
      [1910, 1915) 0.0 1.0 
Z   [1900, 1905) 0.0 1.0 

年の列がパンダ(またはnumpyの)などのパラメータ化されていない私の知る限り、ステップサイズでカットオプションを提供していません。しかし、私はそれが最小値/最大値についての少しの計算で行うことができると思います。何かのように:

df['Year'] = pd.to_datetime(df['Year-Mth']).dt.year 
df['Year'] = pd.cut(df['Year'], bins=np.arange(df['Year'].min(), 
        df['Year'].max() + 5, 5), right=False) 

これは、Excelのような素晴らしいビンを作成しません。

+0

この回答に感謝 - しかし、あなたは再サンプリング機能を使用することが可能であるところのためにデータを取得する場合、私は思う - あなたは、これは、XLのような素敵なビンを作成しません言及としてxlよりも強力です。 – whytheq

+0

似ていますが、resampleと同様の方法が一般的にgroupbyで使用されています。私はそれがpivot_tableで可能かどうかわかりません。 piRSquaredのアプローチと同様、 'df.groupby(['SubCategory'、pd.Grouper(key = 'Year'、freq = '5A')、 'Category'])['counter']。sum()を使うことができます。 (年)] = pd.to_datetime(df ['Year-Mth']) ')。ここで、Yearはdatetime型の列です。 – ayhan