2012-12-04 55 views
1

当我有pandas.DataFramedf与列["A", "B", "C", "D"],我可以使用像df[df["B"] == 2]结构过滤它。索引布尔索引(而不是数据框)

我该怎么做的df[df["B"] == 2]相当于,如果B是一个级别的名称在MultiIndex呢?(例如,通过df.groupby(["A", "B"]).mean()df.setindex(["A", "B"])获得)

回答

1

我会建议之一:

df.xs(2, level='B')

df[df.index.get_level_values('B') == val]

我想打后者操作的语法稍微好一些。

0

我看到越来越这两种方式,这两种看起来像一个弯路 - 这让我觉得一定有我俯瞰这更好的办法。

  • 退耕还林MultiIndex为列:df[df.reset_index()["B"] == 2]
  • 交换我想使用到MultiIndex开始,然后通过索引使用查找名称:df.swaplevel(0, "B").ix[2]
0

我认为你正在寻找分组按指数水平(见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