提问人:Novice 提问时间:11/16/2023 更新时间:11/16/2023 访问量:30
删除 Multiindex 数据帧的行会使 Index 对象保持不变
Dropping rows of Multiindex dataframe leaves Index object intact
问:
当我使用多索引数据帧时,我正在处理一个烦人的问题,即我删除了一些行,然后想要遍历零级索引,但删除的索引仍存储在 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])
有没有办法访问不包含删除值的索引?还是一种仅循环访问零级剩余索引值的方法?
答:
1赞
mozway
11/16/2023
#1
这样做是为了提高效率,您需要使用remove_unused_levels
:
row_dropped.index.remove_unused_levels().levels[0]
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哈哈
评论