删除 Multiindex 数据帧的行会使 Index 对象保持不变

Dropping rows of Multiindex dataframe leaves Index object intact

提问人:Novice 提问时间:11/16/2023 更新时间:11/16/2023 访问量:30

问:

当我使用多索引数据帧时,我正在处理一个烦人的问题,即我删除了一些行,然后想要遍历零级索引,但删除的索引仍存储在 df.index.levels[0] 中

下面是一个可重现的示例:

#make the multiindex df
arrays = [
    ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
    ["one", "two", "one", "two", "one", "two", "one", "two"],
]

tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])
df = pd.DataFrame(np.random.randn(8,2), columns=['first','second'], index=index)

#drop a row
row_dropped = df.drop('foo')
print(row_dropped.index.levels[0])

这导致:Index(['bar', 'baz', 'foo', 'qux'], dtype='object', name='first')

但我想要:Index(['bar', 'baz', 'qux'], dtype='object', name='first')

因为我正在尝试做如下的事情:

for zero_level_index in row_dropped.index.levels[0]:
    print(row_dropped.loc[zero_level_index])

有没有办法访问不包含删除值的索引?还是一种仅循环访问零级剩余索引值的方法?

python-3.x 熊猫

评论


答:

1赞 mozway 11/16/2023 #1

这样做是为了提高效率,您需要使用remove_unused_levels

row_dropped.index.remove_unused_levels().levels[0]

get_level_values

row_dropped.index.get_level_values(0).unique()

输出:Index(['bar', 'baz', 'qux'], dtype='object', name='first')

您可以在高级文档中获取有关此行为的详细信息。

MultiIndex 保留索引的所有定义级别,即使它们 实际上没有使用。对索引进行切片时,您可能会注意到这一点。 [...] 这样做是为了避免重新计算水平,以便使 高性能切片。如果您只想查看已使用的关卡, 您可以使用该方法。 [...] 要仅使用已使用的级别重建 MultiIndex,可以使用该方法。get_level_values()remove_unused_levels()

评论

0赞 Novice 11/16/2023
非常感谢!remove_unused_levels这正是我的想法,但我应该自己想出.unique哈哈