选择内部索引数据

时间:2018-08-05 02:20:16

标签: python pandas dataframe

np.random.seed(0)
data1 = pd.DataFrame(np.random.randn(18).reshape(9,2),
                 index=[['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'],
                        [1, 2, 3, 1, 3, 1, 2, 2, 3]], columns = [1,2])
data1
Out[1]: 
            1         2
a 1  1.764052  0.400157
  2  0.978738  2.240893
  3  1.867558 -0.977278
b 1  0.950088 -0.151357
  3 -0.103219  0.410599
c 1  0.144044  1.454274
  2  0.761038  0.121675
d 2  0.443863  0.333674
  3  1.494079 -0.205158

我想基于内部级别索引= 2选择行。 看来data1.xs(2,level = 1)可以达到目的。

data1.xs(2,level=1)

    Out[2]: 
          1         2
a  0.978738  2.240893
c  0.761038  0.121675
d  0.443863  0.333674

这是使用xs做到这一点的最佳方法吗?我可以使用loc之类的东西吗? 我知道是否有熊猫系列,我可以使用mySeries.loc [:,2]实现这一目标。我们可以做与DataFrame类似的事情吗?

2 个答案:

答案 0 :(得分:2)

如果要保留DataFrame索引级别,请使用loc(axis=0)

data1.loc(axis=0)[:, 2]

            1         2
a 2  0.978738  2.240893
c 2  0.761038  0.121675
d 2  0.443863  0.333674

xs将在级别上进行选择并建立索引,而您在结果中失去该级别。
或者,用drop_level=False指定xs,以免发生这种情况:

data1.xs(2, level=1, drop_level=False)

            1         2
a 2  0.978738  2.240893
c 2  0.761038  0.121675
d 2  0.443863  0.333674

大熊猫的事情是,通常没有单一/最佳的方式来做某事。做最好的事情。

答案 1 :(得分:1)

您可以对元组使用slice索引:

data1.loc[(slice(None),2),:]

           1        2
a 2 0.978738  2.24089
c 2 0.761038 0.121675
d 2 0.443863 0.333674