python - 比“查询”更方便的方法是选择多索引行,通过索引级别的名称指定部分标签?
问题描述
假设您有很多已命名的索引级别——我将在这里展示 4,但请发挥您的想象力:
midx = pd.MultiIndex.from_product([['A0','A1'], ['B0','B1'],['C0','C1'],['D0','D1']],names=['quack','woof','honk','snarf'])
dfmi = pd.DataFrame(np.arange(32).reshape((len(midx), len(columns))),index=midx, columns=columns)
dfmi
foo bar
quack woof honk snarf
A0 B0 C0 D0 0 1
D1 2 3
C1 D0 4 5
D1 6 7
B1 C0 D0 8 9
D1 10 11
C1 D0 12 13
D1 14 15
A1 B0 C0 D0 16 17
D1 18 19
C1 D0 20 21
D1 22 23
B1 C0 D0 24 25
D1 26 27
C1 D0 28 29
D1 30 31
然后,沿着这条线的某个地方,您忘记了名称“snarf”与哪个级别编号相关联,甚至忘记了有多少级别,您想要执行以下操作:
dfmi[dfmi.snarf=='D1']
除了 DataFrame 很大,所以保留另一个,reset_index
ed 副本会占用太多空间,而且无论如何它会很慢,而且,因为懒惰,你不想去查找它,你还不想深入研究另一种语法query
:
dfmi.query('snarf'=='D1')
哎呀!
dfmi.query("'snarf'=='D1'")
哎呀!
dfmi.query("snarf=='D1'")
foo bar
quack woof honk snarf
A0 B0 C0 D1 2 3
C1 D1 6 7
B1 C0 D1 10 11
C1 D1 14 15
A1 B0 C0 D1 18 19
C1 D1 22 23
B1 C0 D1 26 27
C1 D1 30 31
最后!
解决方案
不确定它是否更方便,但基于字符串的查询的一种替代方法是使用index.get_level_values
:
dfmi[dfmi.index.get_level_values('snarf') == 'D1']
foo bar
quack woof honk snarf
A0 B0 C0 D1 2 3
C1 D1 6 7
B1 C0 D1 10 11
C1 D1 14 15
A1 B0 C0 D1 18 19
C1 D1 22 23
B1 C0 D1 26 27
C1 D1 30 31
推荐阅读
- esb - 在 mule 4 中使用带有 XML 数据的映射运算符时无法强制数组错误?
- javascript - 创建循环脚本
- sql-server - 您的代理计算机上未安装 SQL Powershell 模块。请按照以下步骤执行此任务
- jira-rest-api - 访问 Zapi 的执行 API 时出现错误代码 104
- azure - 如何通过 Azure DevOps API 更改拉取请求的目标
- android - 当用户在 Android 中的 Light 和 Dark 模式之间切换时,如何控制使用的颜色
- json - Postgresq 数组到对象值
- google-cloud-platform - 从 Antora 连接到 Google Cloud Source Repository
- java - 如何禁用 Java Swing JRadioButton 的箭头键导航?
- python - Django 模型外键获取属性