查询带切片的多索引 pandas 数据帧
querying a multiindex pandas dataframe with slices
假设我有以下多索引 DF
将 pandas 导入为 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'.
我正在寻找将一系列值传递给查询的方法。类似于 multiindex 3 beeing 在 34567 和 45657 之间。假设这些是整数。
pseudocode: df.loc[idx[:,['pub','pre'],XXXXX,'de',:]]
XXXX = ?
编辑 1:
docId column index是text类型,可能需要先改成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
假设我有以下多索引 DF 将 pandas 导入为 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'.
我正在寻找将一系列值传递给查询的方法。类似于 multiindex 3 beeing 在 34567 和 45657 之间。假设这些是整数。
pseudocode: df.loc[idx[:,['pub','pre'],XXXXX,'de',:]]
XXXX = ?
编辑 1: docId column index是text类型,可能需要先改成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