微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用切片查询多索引熊猫数据框

假设我有以下多索引 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[:,XXXXX,:]]
XXXX = ?

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

解决方法

事实证明 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。