在多指标横截面的一个级别指定多个可能的标准

问题描述 投票:0回答:2

我最近正在使用 MultiIndex,并且正在努力解决如何获取某些数据横截面的问题。具体来说,当我想在索引级别内指定多个类别,但不是该级别的所有类别时。

借用 pandas 文档获取数据:

d = {'num_legs': [4, 4, 2, 2],
     'num_wings': [0, 0, 2, 2],
     'class': ['mammal', 'mammal', 'mammal', 'bird'],
     'animal': ['cat', 'dog', 'bat', 'penguin'],
     'locomotion': ['walks', 'walks', 'flies', 'walks']}
df = pd.DataFrame(data=d)
df = df.set_index(['class', 'animal', 'locomotion'])
df
                           num_legs  num_wings
class  animal  locomotion
mammal cat     walks              4          0
       dog     walks              4          0
       bat     flies              2          2
bird   penguin walks              2          2

我正在使用 pandas.DataFrame.xs() 来获取我想要的数据。我能够根据一个引用获得横截面,如下所示:

df.xs('mammal',level = 'class')
, 并且可以在多个级别上进行细化,如下所示:
df.xs(('mammal','flies'),level = ['class','locomotion'])

当我想要指定蝙蝠和企鹅,而不仅仅是蝙蝠时,事情就会崩溃。

类似这样的声明

df.xs((('mammal','bird')),level = ['class','class'])
从技术上讲是可行的,但它正在寻找“哺乳动物”和“鸟类”的数据,返回一个空数据框。 类似的陈述
df.xs((('mammal','bird')),level = 'class')
返回错误。

.xs 文档不涵盖这种情况。我想要的可能吗?有没有更好的方法?任何能照射到这个主题上的光线都会受到赞赏。

python pandas multi-index
2个回答
0
投票

对于这些情况,我建议仅使用

.loc

out = df.loc[(["mammal", "bird"], slice(None), slice(None))]
print(out)

打印:

                           num_legs  num_wings
class  animal  locomotion                     
mammal cat     walks              4          0
       dog     walks              4          0
       bat     flies              2          2
bird   penguin walks              2          2

0
投票

您在第一级切片,

.loc
效果很好:

df.loc[['mammal','bird']]

输出:

                           num_legs  num_wings
class  animal  locomotion                     
mammal cat     walks              4          0
       dog     walks              4          0
       bat     flies              2          2
bird   penguin walks              2          2
© www.soinside.com 2019 - 2024. All rights reserved.