如何不指定全部索引层级删除pandas多层索引DataFrame的指定数据
解决方案
pandas原生drop方法不支持直接用None作为通配符匹配多层索引,你可以用以下两种方式实现无需指定全层级的删除需求:
方法1:布尔索引过滤(最直观)
通过get_level_values提取指定层级的索引做条件判断,直接保留需要的行:
# 保留「level0不是car 或 level3不是p1」的所有行 dataFrame = dataFrame[~((dataFrame.index.get_level_values('level 0') == 'car') & (dataFrame.index.get_level_values('level 3') == 'p1'))]
如果偏好drop写法,也可以先筛选待删除的索引再传入:
# 先拿到所有符合删除条件的索引 drop_index = dataFrame[(dataFrame.index.get_level_values('level 0') == 'car') & (dataFrame.index.get_level_values('level 3') == 'p1')].index dataFrame.drop(drop_index, axis=0, inplace=True)
方法2:IndexSlice通配匹配(语法更简洁)
pandas提供的IndexSlice支持用冒号:作为对应层级的通配符,和你设想的None通配逻辑完全一致:
idx = pd.IndexSlice # 层级顺序对应:level0=car, level1=任意, level2=任意, level3=p1, level4=任意 dataFrame.drop(dataFrame.loc[idx['car', :, :, 'p1', :], :].index, inplace=True)
内容的提问来源于stack exchange,提问作者Jerzy
相关产品推荐
相关产品推荐

