You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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:分步实现

  1. 先获取切片对应的子集,提取其索引和列名:
subset = df.loc[toSkip]
selected_rows = subset.index
selected_cols = subset.columns
  1. 利用反向筛选获取补集:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:03:21