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

标签 python pandas multi-index

我最近正在使用 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/

相关文章:

c++ - 如何返回 boost multi_index 迭代器的开始和结束

python - 如何聚合行的子集并附加到 MultiIndexed Pandas DataFrame?

python - 通过 "OTHER"python 重命名不太频繁的类别

python - 将 af 字符串更改为具有值的元组列表

python - 如何在继承树中多次包装子方法?

python - 使用 matplotlib 使图形随旋转矩阵旋转

python - 应用多种功能的 PANDAS Group By

python - 在 pandas 中查找并替换子字符串的循环

Python Pandas 按顺序计算多索引中唯一对的出现次数

python - 计算由唯一来源发布的两条新闻之间的平均每日时间量