使用切片查询多索引熊猫数据框

时间:2021-05-18 12:29:21

标签: python pandas multi-index querying

假设我有以下多索引 DF 将熊猫导入为 pd

import numpy as np
import pandas as pd
input_id = np.array(['12345'])
docType = np.array(['pre','pub','app','dw'])
docId = np.array(['34455667'])
sec_type = np.array(['bib','abs','cl','de'])
sec_ids = np.array(['x-y','z-k'])
index = pd.MultiIndex.from_product([input_id,docType,docId,sec_type,sec_ids])
content= [str(randint(1,10))+ '##' + str(randint(1,10)) for i in range(len(index))]
df = pd.DataFrame(content, index=index, columns=['content'])
df.rename_axis(index=['input_id','docType','docId','secType','sec_ids'], inplace=True)
df

我知道我可以按如下方式查询多索引 DF:

# querying a multiindex DF
idx = pd.IndexSlice
df.loc[idx[:,['pub','pre'],:,'de',:]]

基本上在 pd.IndexSlice 的帮助下,我可以为每个索引传递我想要的值。在上述情况下,我想要结果 DF,其中第二个索引是 'pub' OR 'pre',第四个是 'de'。

我正在寻找将一系列值传递给查询的方法。类似于 34567 和 45657 之间的多索引 3。假设它们是整数。

pseudocode: df.loc[idx[:,['pub','pre'],XXXXX,'de',:]]
XXXX = ?

编辑 1: docId 列索引为文本类型,可能需要先将其更改为 int

1 个答案:

答案 0 :(得分:1)

事实证明 query 非常强大:

df.query('docType in ["pub","pre"] and ("34455667" <= docId <= "3445568") and (secType=="de")')

输出:

                                          content
input_id docType docId    secType sec_ids        
12345    pre     34455667 de      x-y        2##9
                                  z-k        6##1
         pub     34455667 de      x-y        6##5
                                  z-k        9##8