使用多重索引时,要通过元组指定列以删除特定列,或者指定级别以删除该索引级别上具有该键的所有列。
不要说删除列 'c',而是像下面这样说删除('a','c'):
df.drop(('a', 'c'), axis = 1, inplace = True)
或者按照以下所示指定级别
df.drop('c', axis = 1, level = 1)
让我们创建一个简单的数据框作为演示:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c"),
... ("a", "f"), ('x', 'c'),('x', 'f')])
>>> df = pd.DataFrame([[1,3, 7, 21, 8], [2, 4, 9, 21, 8]], columns=cols)
>>> df
a x
b c f c f
0 1 3 7 21 8
1 2 4 9 21 8
现在让我们来看一下如何从 'a' 中删除 'c'
>>> df.drop(('a', 'c'), axis = 1)
a x
b f c f
0 1 7 21 8
1 2 9 21 8
如果有三个层级的索引,那么在元组中包含该关键字以从底层删除,例如('a','c','k')
如果索引只有一个值,就像你所做的那样,默认情况下它会在顶层索引中搜索匹配项,并删除该索引上的匹配项,或者如果该键不在索引中则抛出错误,就像你发现的那样。
因此,在我的示例中,告诉它只删除“x”是可以的。
>>> df.drop('x', axis = 1)
a
b c f
0 1 3 7
1 2 4 9
要删除所有第二个索引为'c'的列,则需要指定级别
>>> df.drop('c', axis = 1, level = 1)
a x
b f f
0 1 7 8
1 2 9 8
FrozenList
,因此不会受到这个操作的影响。你可以使用df.columns.remove_unused_levels()
来获取最新的索引。 - Kevin Wittekcols = pd.MultiIndex.from_tuples( [("a", "b"), ("a", "c"), ("a", "f"), ("x", "c"), ("x", "f")] ) df = pd.DataFrame([[1, 3, 7, 21, 8], [2, 4, 9, 21, 8]], columns=cols) df.drop(["x"], inplace=True, axis=1, level=0) df.columns.remove_unused_levels().levels[0]
- Vadym Tyemirovinplace = True
,但是一般情况下,pandas正在摆脱inplace
选项,因此最好执行df = df.drop('c', axis=1, level=1)
。 - Barzi2001