我最近正在使用 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('哺乳动物',level = 'class')
,
并且可以在多个级别上进行细化,如下所示:
df.xs(('哺乳动物','苍蝇'),level = ['class','locomotion'])
当我想指定 bat 和企鹅,而不仅仅是 bat 时,事情就会崩溃。
像这样的声明
df.xs((('哺乳动物','鸟')),level = ['class','class'])
从技术上讲是可行的,但它正在寻找“哺乳动物”和“鸟类”的数据,返回一个空数据框。
类似的陈述
df.xs((('哺乳动物','鸟类')),level = '类')
返回错误。
.xs 文档不涵盖这种情况。我想要的可能吗?有没有更好的方法?任何你能照亮这个主题的光都会受到赞赏。
编辑: 两位受访者的回答非常有帮助。我应该提到,我正在处理的一些数据在列级别是多重索引的,这也是我查看 df.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
编辑:对于多索引列:
初始df
:
num_legs num_wings
A B A B
class animal locomotion
mammal cat walks 4 0 1 2
dog walks 4 0 1 2
bat flies 2 2 1 2
bird penguin walks 2 2 2 2
bacteria coli swims -1 -1 -1 -1
然后:
out = df.loc[(["mammal", "bird"], slice(None), "walks"), ((slice(None), "A"))]
print(out)
打印:
num_legs num_wings
A A
class animal locomotion
mammal cat walks 4 1
dog walks 4 1
bird penguin walks 2 2
关于python - 在多指标横截面的一个级别指定多个可能的标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77068855/