首页 > 解决方案 > 使用标签和布尔组合对多索引 Pandas 进行子集化

问题描述

给定一个多索引数据框,如何选择与索引的一个标签相关并且在列中具有特定值的所有行?

这是一个示例数据框:

import pandas as pd

index = pd.MultiIndex.from_product([['xy1','xy2','xy3'], ['1','2','3','4','5']], names=['Tag', 'Page'])
df = pd.DataFrame([1,1,1,4,5,1,1,61,4,51,1,1,4,5,1], index, columns=['Value'])
df

从中我想选择所有带有标签xy1 且Value为 1 的行。因此,产生这个:

index2 = pd.MultiIndex.from_product([['1','2','3']], names=['Page'])
df2 = pd.DataFrame([1,1,1], index2, columns=['Value'])
df2

我怎样才能以优雅的方式实现这一目标?

标签: pythonpandas

解决方案


使用DataFrame.query和删除第一级DataFrame.reset_index

df1 = df.query("Tag == 'xy1' & Value == 1").reset_index(level=0, drop=True)

或首先按第一级选择,DataFrame.xs然后按Value列过滤:

df1 = df.xs('xy1').query("Value == 1")
print (df1)
      Value
Page       
1         1
2         1
3         1

推荐阅读