我有一个多级列表,如下所示:
a ---+---+--- b | c | f --+---+---+--- 0 | 1 | 2 | 7 1 | 3 | 4 | 9
如何按名称删除列“c”?如下所示:
a ---+--- b | f --+---+--- 0 | 1 | 7 1 | 3 | 9
我试过这个:
del df['c']
但是我得到了下面的错误,这是有道理的:KeyError:“键长度(1)大于MultiIndex lexsort深度(0)”
juzqafwq1#
已解决:
df.drop('c', axis=1, level=1)
mwg9r5ms2#
对于多索引,我们必须使用元组来指定列,以便删除特定列,或者指定级别以删除该索引级别上具有该键的所有列。不要说drop column 'c',而说drop ('a ','c'),如下所示:
df.drop(('a', 'c'), axis = 1, inplace = True)
或按如下所示指定级别
df.drop('c', axis = 1, level = 1)
让我们做一个简单的df来演示:
>>> 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
snvhrwxg3#
这对我不起作用。当添加'inplace=True'时才起作用。正确的语句是df.drop('c ',axis = 1,level = 1,inplace=True)
3条答案
按热度按时间juzqafwq1#
已解决:
mwg9r5ms2#
对于多索引,我们必须使用元组来指定列,以便删除特定列,或者指定级别以删除该索引级别上具有该键的所有列。
不要说drop column 'c',而说drop ('a ','c'),如下所示:
或按如下所示指定级别
让我们做一个简单的df来演示:
下面是如何从“a”中删除“c”
对于三级索引,则将该关键字包含在元组中以从底层删除,例如 ('a ','c','k ')
使用单个值作为索引(如您所做的),默认情况下,它搜索顶级索引以查找匹配项,并丢弃该索引上的匹配项,或者如果键不在索引中(如您所发现的),则抛出错误。
所以在我的例子中,告诉它只删除'x'就可以了
要删除第二个索引为'c'的所有列,请指定级别
snvhrwxg3#
这对我不起作用。当添加'inplace=True'时才起作用。正确的语句是df.drop('c ',axis = 1,level = 1,inplace=True)