如何用slice排除DataFrame中的指定行与列(取切片补集)
获取MultiIndex DataFrame切片的补集
原DataFrame定义
import pandas as pd import numpy as np index = pd.MultiIndex.from_product([["A", "B"], ["AA", "BB"]]) columns = pd.MultiIndex.from_product([["X", "Y"], ["XX", "YY"]]) df = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]], index = index, columns = columns)
切片对象
toSkip = ((slice(None), slice(None)), (["X"], slice(None)))
已知df.loc[toSkip]可获取指定切片的子集,现需获取原DataFrame排除该子集后的补集(即保留未被toSkip选中的行列)。
解决方案
核心思路是先定位被切片选中的行和列,再筛选出未被选中的部分:
方法1:分步实现
- 先获取切片对应的子集,提取其索引和列名:
subset = df.loc[toSkip] selected_rows = subset.index selected_cols = subset.columns
- 利用反向筛选获取补集:
complement_df = df.loc[~df.index.isin(selected_rows), ~df.columns.isin(selected_cols)]
方法2:一步简写
无需保留中间变量的话,可直接合并为一行:
complement_df = df.loc[ ~df.index.isin(df.loc[toSkip].index), ~df.columns.isin(df.loc[toSkip].columns) ]
结果验证
运行后complement_df会保留所有行(因toSkip选中了全部行),仅保留列层级第一级为Y的列,输出如下:
Y XX YY A AA 3 4 BB 7 8 B AA 11 12 BB 15 16
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

