python - 使用 Pandas MultiIndex 选择多行分层 DataFrame
问题描述
我有一个带有 3 个级别的 MultiIndex 的 Pandas DataFrame。假设我有以下数据
df = pd.DataFrame({'ColB': {('A1', 'B1', 1): 'cb1',
('A1', 'B1', 2): 'cb2',
('A1', 'B2', 1): 'cb3',
('A1', 'B2', 2): 'cb4',
('A2', 'B1', 1): 'cb5',
('A2', 'B1', 2): 'cb6',
('A2', 'B2', 1): 'cb7',
('A2', 'B2', 2): 'cb8'},
'colA': {('A1', 'B1', 1): 'ca1',
('A1', 'B1', 2): 'ca2',
('A1', 'B2', 1): 'ca3',
('A1', 'B2', 2): 'ca4',
('A2', 'B1', 1): 'ca5',
('A2', 'B1', 2): 'ca6',
('A2', 'B2', 1): 'ca7',
('A2', 'B2', 2): 'ca8'}})
ColB colA
A1 B1 1 cb1 ca1
2 cb2 ca2
B2 1 cb3 ca3
2 cb4 ca4
A2 B1 1 cb5 ca5
2 cb6 ca6
B2 1 cb7 ca7
2 cb8 ca8
现在,我有一个 MultiIndex 对象,其中包含前两个级别的索引,例如
MultiIndex([('A1', 'B2'),
('A2', 'B1')],
)
我想使用该 MultiIndex 选择与该 MultiIndex 对应的所有行,包括第 3 级的所有索引,例如,
ColB colA
A1 B2 1 cb3 ca3
2 cb4 ca4
A2 B1 1 cb5 ca5
2 cb6 ca6
我怎样才能做到这一点?我一直在寻找答案几个小时,但我仍然不知道。谢谢你。
解决方案
Index.isin
与 remove 3rd level byMultiIndex.droplevel
和 filter by一起使用boolean indexing
:
df = df[df.index.droplevel(2).isin(mux)]
print (df)
ColB colA
A1 B2 1 cb3 ca3
2 cb4 ca4
A2 B1 1 cb5 ca5
2 cb6 ca6
它适用于任何index
:
mux = pd.MultiIndex.from_tuples([('A1', 'B1'),('A2', 'B2')])
df = df[df.index.droplevel(2).isin(mux)]
print (df)
ColB colA
A1 B1 1 cb1 ca1
2 cb2 ca2
A2 B2 1 cb7 ca7
2 cb8 ca8
推荐阅读
- python - 问题排序(按递减顺序)条形图绘制我的数据框的前 30 个值,使用 Seaborn
- vba - Access 2016 运行时错误无效使用 null
- mysql - 用于在查询中插入常量的绑定参数?
- cocoa - NSString 类别在 NSTaggedPointerString 上失败
- r - 在R中使用smoothScatter在散点图上绘制趋势线
- macos - XAMPP 7.2.10-0 - 应用程序管理器 (manager-osx) 空白按钮
- scala - 使用 NSC 编译 Scala 对象
- javascript - 如何按布尔字符串字段对javascript对象集合进行排序
- makefile - makefile:意外标记“,”附近的语法错误
- c# - How to create a C# application that opens "cmd.exe" in another window?