pandas.DataFrame
df
with columnsがある場合["A", "B", "C", "D"]
、 のような構造を使用してフィルタリングできますdf[df["B"] == 2]
。
レベルの名前が代わりにあるdf[df["B"] == 2]
場合、どうすればと同等のことを行うことができますか? B
MultiIndex
df.groupby(["A", "B"]).mean()
(例:またはで取得df.setindex(["A", "B"])
)
次のいずれかをお勧めします。
df.xs(2, level='B')
また
df[df.index.get_level_values('B') == val]
後者の操作の構文をもう少し良くしたいと思います。
これを取得するには 2 つの方法がありますが、どちらも回り道のように見えます。見落としているより良い方法があるに違いないと思います。
MultiIndex
を列に変換する:df[df.reset_index()["B"] == 2]
MultiIndex
インデックスによるルックアップを使用します。df.swaplevel(0, "B").ix[2]
インデックスレベルでグループ化しようとしていると思います(GroupBy with MultiIndexを参照)。
これは短いが、あまりエキサイティングではない例です:
In [126]: df = DataFrame([[1,2,3,4],[2,2,np.nan,6]],columns=["A", "B", "C", "D"])
In [127]: df1 = df.set_index(['A','B'])
In [128]: df1
Out[128]:
C D
A B
1 2 3 4
2 2 NaN 6
In [129]: df1.groupby(level='B', axis=0).mean()
Out[129]:
C D
B
2 3 5