2017-08-16 14 views
2

は、私は、マルチインデックス付きのデータフレームパンダでサブデータフレームを集計するにはどうすればよいですか?

In [1]: index = pd.MultiIndex.from_tuples([(i,j) for i in range(3) 
     :           for j in range(1+i)], names=list('ij')) 
     : df = pd.DataFrame(0.1*np.arange(2*len(index)).reshape(-1,2), 
     :     columns=list('xy'), index=index) 
     : df 
Out[1]: 
     x y 
i j 
0 0 0.0 0.1 
1 0 0.2 0.3 
    1 0.4 0.5 
2 0 0.6 0.7 
    1 0.8 0.9 
    2 1.0 1.1 

2-平準化していると私はすべてのサブデータフレームにカスタム関数を実行したいとします

In [2]: def my_aggr_func(subdf): 
     :  return subdf['x'].mean()/subdf['y'].mean() 
     : 
     : level0 = df.index.levels[0].values 
     : pd.DataFrame({'mean_ratio': [my_aggr_func(df.loc[i]) for i in level0]}, 
     :    index=pd.Index(level0, name=index.names[0])) 
Out[2]: 
    mean_ratio 
i 
0 0.000000 
1 0.750000 
2 0.888889 

df.groupby('i').agg(__something__)でそれを行うためのエレガントな方法はあります何か似たようなもの? DataFrameでの作業

答えて

2

必要性GroupBy.apply、:

df1 = df.groupby('i').apply(my_aggr_func).to_frame('mean_ratio') 
print (df1) 
    mean_ratio 
i    
0 0.000000 
1 0.750000 
2 0.888889 
+1

ありがとうございました!私は「適用」を完全に忘れていました。 –

1

あなたはカスタム関数を必要としません。 aggで 'within group means'を計算し、evalを実行して、希望の比率を得ることができます。

df.groupby('i').agg('mean').eval('x/y') 

i 
0 0.000000 
1 0.750000 
2 0.888889 
dtype: float64 
+0

私はもっと洗練されたものを求めています。例えば、 'y(x)'にいくつかの関数とフィットの出力パラメータをフィットさせます。 –

+0

@ jezraelの回答を受け入れることをお勧めします。多くの場合、SO上の誰かが、より洗練された問題に対するより洗練されたソリューションを見つけるのに役立ちます。 'fit 'が回帰を意味する場合、新しい質問に' sklearn'と 'numpy'タグを付けることを検討するかもしれません。そうすれば、「pandas」ではなく、それらのタグに従う他のスマートな人々も同様にそれを見るでしょう。 – piRSquared

関連する問題