如何从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"
错误原因分析
- 第一个
NameError:level参数需要传入字符串形式的层级名称,你直接写了bnds,Python会将其视为未定义的变量,因此报错。 - 第二个
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
相关产品推荐
相关产品推荐

