首页 > 解决方案 > Python Pandas Multiindexing选择匹配列表中所有值的行

问题描述

考虑以下数据框。

import Pandas as pd
df = pd.Dataframe
df = pd.DataFrame()
df['Folder'] = [2,3,4,5  ,2,4,5, 2,3,4, 2,3,4,5,1]
df['Country'] = ['USA','USA','USA','USA'  ,'Mexico','Mexico','Mexico', 'UK','UK','UK', 'Canada','Canada','Canada','Canada','Canada']
df['Data'] = [20,30,43,15  ,25,44,15, 26,37,47, 24,34,47,55,18]
df.set_index(['Country','Folder'], drop=True, inplace=True)
df


                Data
Country Folder      
USA     2         20
        3         30
        4         43
        5         15
Mexico  2         25
        4         44
        5         15
UK      2         26
        3         37
        4         47
Canada  2         24
        3         34
        4         47
        5         55
        1         18

如何收集文件夹在级别文件夹中具有所有 lst=[1,3,4] 的行?

                Data
Country Folder      

Canada  2         24
        3         34
        4         47
        5         55
        1         18

或者

                Data
Country Folder      
Canada  3         34
        4         47
        1         18

要么对我有用。我想知道加拿大匹配所有 lst。lst 最多可包含 8 个项目。

我试过 df.query("Folder in @lst") 但是它返回匹配任何 lst 的行。我需要匹配所有 lst。

提前感谢您的帮助。

标签: pythonpandasmulti-index

解决方案


使用GroupBy.transformwitt 将值转换为集合并使用issubsetget all groups with all values in Folderby lst

lst=[1,3,4]

f = lambda x: set(lst).issubset(set(x.index.get_level_values('Folder')))
mask = df.groupby('Country')['Data'].transform(f)

df1 = df[mask]
print (df1)
                Data
Country Folder      
Canada  2         24
        3         34
        4         47
        5         55
        1         18

最后,如果只需要匹配的值:

 df2 = df1[df1.index.isin(lst)]

推荐阅读