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

如何从Pandas多级索引DataFrame删除bnds=1.0的行?解决报错

解决Pandas多级索引DataFrame删除指定层级行的问题

问题描述

我有一个如下所示的Pandas多级索引(MultiIndex)DataFrame,需要删除其中bnds层级值等于1.0的行。

最初尝试的代码:

df_f.drop('1.0', level=bnds, axis=0, inplace=True)

报错:NameError: name 'bnds' is not defined

DataFrame示例:

Honolulu        time_bnds        Seattle
bnds    time            
1.0    2015-01-01 12:00:00      70.277412   2015-01-01 00:00:00   13.346752
       2015-01-02 12:00:00      69.948593   2015-01-02 00:00:00   31.655853
       2015-01-03 12:00:00      70.228027   2015-01-03 00:00:00   31.511438
2.0    2015-01-01 12:00:00      70.277412   2015-01-01 00:00:00   13.346752
       2015-01-02 12:00:00      69.948593   2015-01-02 00:00:00   31.655853

更新:将level参数改为字符串"bnds"后,出现新错误:

5433 def drop(
   5434     self,
   5435     labels: IndexLabel | None = None,
   (...)
   5442     errors: IgnoreRaise = "raise",
   5443 ) -> DataFrame | None:
   5444     """
   5445     Drop specified labels from rows or columns.
   5446 
   (...)
   5579             weight  1.0     0.8
   5580     """
-> 5581     return super().drop(
   5582         labels=labels,
   5583         axis=axis,
   5584         index=index,
   5585         columns=columns,
   5586         level=level,
   5587         inplace=inplace,
   5588         errors=errors,
   5589     )

File /srv/conda/envs/notebook/lib/python3.11/site-packages/pandas/core/generic.py:4788, in NDFrame.drop(self, labels, axis, index, columns, level, inplace, errors)
   4786 for axis, labels in axes.items():
   4787     if labels is not None:
-> 4788         obj = obj._drop_axis(labels, axis, level=level, errors=errors)
   4790 if inplace:
   4791     self._update_inplace(obj)

File /srv/conda/envs/notebook/lib/python3.11/site-packages/pandas/core/generic.py:4828, in NDFrame._drop_axis(self, labels, axis, level, errors, only_slice)
   4826     if not isinstance(axis, MultiIndex):
   4827         raise AssertionError("axis must be a MultiIndex")
-> 4828     new_axis = axis.drop(labels, level=level, errors=errors)
   4829 else:
   4830     new_axis = axis.drop(labels, errors=errors)

File /srv/conda/envs/notebook/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2408, in MultiIndex.drop(self, codes, level, errors)
   2361 """
   2362 Make a new :class:`pandas.MultiIndex` with the passed list of codes deleted.
   2363 
   (...)
   2405            names=['number', 'color'])
   2406 """
   2407 if level is not None:
-> 2408     return self._drop_from_level(codes, level, errors)
   2410 if not isinstance(codes, (np.ndarray, Index)):
   2411     try:

File /srv/conda/envs/notebook/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2462, in MultiIndex._drop_from_level(self, codes, level, errors)
   2460 not_found = codes[values == -2]
   2461 if len(not_found) != 0 and errors != "ignore":
-> 2462     raise KeyError(f"labels {not_found} not found in level")
   2463 mask = ~algos.isin(self.codes[i], values)
   2465 return self[mask]

KeyError: "labels ['1.0'] not found in level"

错误原因分析

  1. 第一个NameError:level参数需要传入字符串形式的层级名称,你直接写了bnds,Python会将其视为未定义的变量,因此报错。
  2. 第二个KeyError:你传入的标签是字符串'1.0',但DataFrame中bnds层级的实际值是数值类型的1.0,类型不匹配导致无法找到对应标签。

解决方案

方法1:使用正确的数值标签调用drop

将字符串'1.0'改为数值1.0,同时level参数传入字符串"bnds":

df_f.drop(1.0, level="bnds", axis=0, inplace=True)

方法2:布尔索引筛选

通过索引层级值直接筛选,避免类型匹配问题:

df_f = df_f[df_f.index.get_level_values("bnds") != 1.0]

方法3:query方法(Pandas 1.4.0+支持)

使用更简洁的查询语法:

df_f = df_f.query("bnds != 1.0")

内容的提问来源于stack exchange,提问作者Petr Kashlikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:25:55