索引上的布尔索引(而不是数据帧)

时间:2012-12-04 10:39:28

标签: python pandas

当我有pandas.DataFrame df["A", "B", "C", "D"]时,我可以使用df[df["B"] == 2]等结构对其进行过滤。

如果df[df["B"] == 2]是[{1}}中某个级别的名称而不是B,我该如何做相当于MultiIndex的工作?(例如,获取者df.groupby(["A", "B"]).mean()df.setindex(["A", "B"])

3 个答案:

答案 0 :(得分:1)

我建议:

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

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

我想让后一种操作的语法更好一些。

答案 1 :(得分:0)

我看到了两种获得这种方式的方法,这两种方式看起来都像绕道而行 - 这让我觉得必须有一种更好的方式让我忽视。

  • MultiIndex转换为列:df[df.reset_index()["B"] == 2]
  • 将我想要使用的名称交换到MultiIndex的开头,然后按索引使用查找:df.swaplevel(0, "B").ix[2]

答案 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