Python Pandas: удалить столбец из индекса многоуровневого столбца?

у меня есть многоуровневая таблица столбцов, как это:

    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)'

2 ответов


решила:

df.drop('c', axis=1, level=1)

с несколькими индексами мы должны указать столбец с помощью кортежа, чтобы удалить определенный столбец, или указать уровень, чтобы удалить все столбцы с этим ключом на этом уровне индекса.

вместо того, чтобы говорить Drop column 'c' говорят падение ('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

теперь вот как отбросить 'c' из 'a'

>>> 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