我最近正在使用 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 文档不涵盖这种情况。我想要的可能吗?有没有更好的方法?任何能照射到这个主题上的光线都会受到赞赏。
对于这些情况,我建议仅使用
.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
您在第一级切片,
.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