python - 按给定级别和列值的特定索引过滤 pandas MultiIndex
问题描述
给定以下数据框:
import pandas as pd
import numpy as np
indices = [['A', 'B', 'C'], ['a', 'b', 'c', 'd'], ['1', '2', '3']]
index = pd.MultiIndex.from_product(indices, names=['first', 'second', 'third'])
df = pd.DataFrame(np.random.randint(10, size=(36, 4)), index=index, columns=['Val1','Val2',' Val3', 'Val4'])
例如:
Val1 Val2 Val3 Val4
first second third
A a 1 1 7 2 1
2 0 0 8 6
3 3 2 0 5
b 1 3 8 8 8
2 3 1 0 5
3 7 2 8 5
c 1 9 9 5 3
2 2 5 5 8
3 7 5 1 5
d 1 2 7 8 6
2 9 0 0 2
3 9 4 1 4
B a 1 1 2 3 3
2 3 2 3 1
3 1 3 2 2
b 1 4 4 3 1
2 9 4 8 2
3 6 7 8 8
c 1 6 6 3 2
2 2 6 5 6
3 6 4 2 7
d 1 1 1 1 5
2 6 4 8 1
3 3 4 3 1
C a 1 0 3 4 0
2 5 0 1 4
3 1 1 5 7
b 1 2 6 1 7
2 2 6 4 3
3 0 5 6 6
c 1 0 2 3 7
2 7 1 1 1
3 2 6 2 0
d 1 6 2 2 1
2 9 3 1 9
3 7 5 6 1
我将如何按任何索引级别和特定列值过滤此数据框?
编辑
例如,如果我想保留所有更高级别的索引(即level=0
和level=1
),如果相应的third
索引 ( level=2
) 的1
列Val 2
值大于5
. 因此,如果索引1
中的third
索引不具有Val2
大于 的值5
,则与该second
索引对应的级别索引将从数据帧中删除。
我尝试解决方案,或者至少传达我的意图(因为这会产生错误):
df[df.loc[pd.IndexSlice[:, :, '1'], 'Val2'] > 5]
这给了我以下错误:
pandas.core.indexing.IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match)
在此示例中,我的预期输出如下:
Val1 Val2 Val3 Val4
first second third
A a 1 1 7 2 1
2 0 0 8 6
3 3 2 0 5
b 1 3 8 8 8
2 3 1 0 5
3 7 2 8 5
c 1 9 9 5 3
2 2 5 5 8
3 7 5 1 5
d 1 2 7 8 6
2 9 0 0 2
3 9 4 1 4
B c 1 6 6 3 2
2 2 6 5 6
3 6 4 2 7
C b 1 2 6 1 7
2 2 6 4 3
3 0 5 6 6
好奇这是否可以实现,df.filter()
或者我是否缺少一种在 a 上执行此过滤的简单方法MultiIndex
?先感谢您。
解决方案
推荐阅读
- ios - 编辑 UILable,隐藏 inputAccessoryView [swift 5]
- angular - Angular Mat-Slide-Toggle 响应缓慢
- python - 试图从 yelp 中获取线索
- haskell - Haskell 使用索引从字符串矩阵递归地将数据元素添加到矩阵
- r - 使用 rtweet 从推文中获取媒体
- dojo - 在 WCM 中隐藏 Dojo 对话框
- drop-down-menu - 使用 Angular 6+ 表单数组复制动态选择框
- python - 在 Alexa 开发者控制台中使用 beautifulsoup4
- css - 通过 CSS 获取页眉和页脚高度
- java - isSelected() , isDisplayed 在 selenium 中对我不起作用,在 java 中用于复选框。xpath 不显示是否选中或未选中