python - Pandas MultiIndex 的子集适用于整个索引,但不适用于特定级别?
问题描述
我遇到了奇怪的行为 apd.MultiIndex
并试图了解发生了什么。与其说是寻找解决方案,不如说是解释。
假设我有一个 MultiIndexed 数据框:
index0 = pd.Index(['a', 'b', 'c'], name='let')
index1 = pd.Index(['foo', 'bar', 'baz'], name='word')
x = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=[index0, index1])
display(x)
0 1 2
let word
a foo 1 2 3
b bar 4 5 6
c baz 7 8 9
如果我然后使用该数据框的子集df.loc
:
sub = ['a', 'c']
y = x.loc[sub]
display(y)
0 1 2
let word
a foo 1 2 3
c baz 7 8 9
到目前为止,一切都很好。现在,查看新数据框的索引:
display(y.index)
MultiIndex([('a', 'foo'),
('c', 'baz')],
names=['let', 'word'])
这也有道理。但是,如果我查看子集数据帧索引的特定级别...
display(y.index.levels[1])
Index(['bar', 'baz', 'foo'], dtype='object', name='word')
突然我有了原始完整数据框的值,而不是选定的子集!
为什么会这样?
解决方案
我们需要为此添加一个特定的函数remove_unused_levels
,因为它是类别类型的数据
y.index.levels[0]
Index(['a', 'b', 'c'], dtype='object', name='let')
# after add
y.index=y.index.remove_unused_levels()
y.index.levels[0]
Index(['a', 'c'], dtype='object', name='let')
推荐阅读
- python - 有没有办法在 PyCharm 中读取和更改一个巨大的 csv 文件的内容?
- mysql - 如何使用 Windows 10 在 MariaDB 中进行复制?服务出现错误 1067
- android - 安卓刀柄。如何重建依赖关系树?
- html - 具有可重复行级元素的 HTML CSS 可打印 2 列表
- python - 为什么我通过终端在 Mac OS 上安装的软件包返回 ModuleNotFoundError:尝试通过 IDLE 导入它们时
- flutter - 如何编写一个条件之一为空的 Flutter 三元运算符(什么都不做)
- mongodb - 将字符串数组传递给 MongoDb Schema
- excel - 在一台计算机上而不是在另一台计算机上获取“请重建此数据组合”
- sql-server - SQL Server 索引对不同值的查找表
- azure - Azure Blob Storage V2,来自 Azure Function App 的异常 API 调用,升级后