python - 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。
提前感谢您的帮助。
解决方案
使用GroupBy.transform
witt 将值转换为集合并使用issubset
get all groups with all values in Folder
by 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)]
推荐阅读
- python - 替换饼图数据会导致损坏
- scala - Spark 作为 Hive 的执行引擎
- python - 多项式回归失败
- python - ValueError:无法从尝试在 2 个不同的集合之间复制列值的重复轴重新索引
- zeromq - Zmq_Push 和 Zmq_Pull 套接字
- python - 识别和打破异常:'OpenSSL.SSL.Error'使用python的请求模块
- arduino - 在 ESP8266 的单个 GPIO 引脚上检测来自多个组件的输入
- java - Java Spring:在控制器中获取当前映射
- javascript - Plotly.js x 轴无法删除线
- c# - IIS Express 中的 Windows 身份验证不会获取用户详细信息