4

DataFrameたとえば、MultiIndex があります。

In [1]: arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]]
In [2]: df = DataFrame(randn(6,2),index=MultiIndex.from_tuples(zip(*arrays)),columns=['A','B'])
In [3]: df
Out [3]:
          A         B
one 1 -2.028736 -0.466668
    2 -1.877478  0.179211
    3  0.886038  0.679528
two 1  1.101735  0.169177
    2  0.756676 -1.043739
    3  1.189944  1.342415

次に、各行 (インデックス レベル 0) と各列の要素 2 と 3 (インデックス レベル 1) の平均を計算します。だから私は次のようなDataFrameが必要です

                                 A                            B
one 1 mean(df['A'].ix['one'][1:3])  mean(df['B'].ix['one'][1:3])
two 1 mean(df['A'].ix['two'][1:3])  mean(df['B'].ix['two'][1:3])

元のデータ フレームの行 (インデックス レベル 0) のループを使用せずにそれを行うにはどうすればよいですか? パネルに対して同じことをしたい場合はどうすればよいですか? groupby を使用した簡単な解決策があるはずですが、まだ学習中であり、答えが思いつきません。

4

3 に答える 3

2

xs関数を使用してレベルを選択できます。

で始まります:

              A         B
one 1 -2.712137 -0.131805
    2 -0.390227 -1.333230
    3  0.047128  0.438284
two 1  0.055254 -1.434262
    2  2.392265 -1.474072
    3 -1.058256 -0.572943

次に、以下を使用して新しいデータフレームを作成できます。

DataFrame({'one':df.xs('one',level=0)[1:3].apply(np.mean), 'two':df.xs('two',level=0)[1:3].apply(np.mean)}).transpose()

結果が得られます:

            A         B
one -0.171549 -0.447473
two  0.667005 -1.023508

レベル内の項目を指定せずに同じことを行うには、groupbyを使用できます。

grouped = df.groupby(level=0)
d = {}

for g in grouped:
    d[g[0]] = g[1][1:3].apply(np.mean)

DataFrame(d).transpose()

パネルについてはよくわかりません-十分に文書化されていませんが、同様のことが可能であるはずです

于 2012-07-30T13:20:59.177 に答える
0

以下をせよ:

# Specify the indices you want to work with.
idxs = [("one", elem) for elem in [2,3]] + [("two", elem) for elem in [2,3]]

# Compute grouped mean over only those indices.
df.ix[idxs].mean(level=0)
于 2012-11-07T19:27:40.920 に答える