マルチインデックスDataFrameから1つのインデックスのみを使用して新しいDataFrameを作成しようとしています。
A B C
first second
bar one 0.895717 0.410835 -1.413681
two 0.805244 0.813850 1.607920
baz one -1.206412 0.132003 1.024180
two 2.565646 -0.827317 0.569605
foo one 1.431256 -0.076467 0.875906
two 1.340309 -1.187678 -2.211372
qux one -1.170299 1.130127 0.974466
two -0.226169 -1.436737 -2.006747
理想的には、私はこのようなものを望みます:
In: df.ix[level="first"]
そして:
Out:
A B C
first
bar 0.895717 0.410835 -1.413681
0.805244 0.813850 1.607920
baz -1.206412 0.132003 1.024180
2.565646 -0.827317 0.569605
foo 1.431256 -0.076467 0.875906
1.340309 -1.187678 -2.211372
qux -1.170299 1.130127 0.974466
-0.226169 -1.436737 -2.006747
`
基本的に、レベルfirst
以外のマルチインデックスの他のすべてのインデックスを削除します。これを行う簡単な方法はありますか?
1つの方法は、df.index
をMultiIndexの目的のレベルに単純に再バインドすることです。保持したいラベル名を指定することにより、これを行うことができます。
df.index = df.index.get_level_values('first')
または、レベルの整数値を使用します。
df.index = df.index.get_level_values(0)
MultiIndexの他のすべてのレベルはここで消えます。
ソリューションはかなり新しいものであり、 df.xs
関数として
In [88]: df.xs('bar', level='first')
Out[88]:
Second Third
one A -2.315312
B 0.497769
C 0.108523
two A -0.778303
B -1.555389
C -2.625022
dtype: float64
次のように複数のインデックスで行うこともできます
In [89]: df.xs(('bar', 'A'), level=('First', 'Third'))
Out[89]:
Second
one -2.315312
two -0.778303
dtype: float64
例の設定は以下のとおりです
import pandas as pd
import numpy as np
arrays = [
np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])
]
index = pd.MultiIndex.from_tuples(list(Zip(*arrays)), names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
df.index.names = pd.core.indexes.frozen.FrozenList(['First', 'Second', 'Third'])
df = df.unstack()