当我有pandas.DataFrame
df
与列["A", "B", "C", "D"]
,我可以使用像df[df["B"] == 2]
结构过滤它。索引布尔索引(而不是数据框)
我该怎么做的df[df["B"] == 2]
相当于,如果B
是一个级别的名称在MultiIndex
呢?(例如,通过df.groupby(["A", "B"]).mean()
或df.setindex(["A", "B"])
获得)
当我有pandas.DataFrame
df
与列["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]
我想打后者操作的语法稍微好一些。
我看到越来越这两种方式,这两种看起来像一个弯路 - 这让我觉得一定有我俯瞰这更好的办法。
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