Если у меня есть многоуровневый индекс столбца:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
--- + - б | с - + --- + - 0 | 1 | 2 1 | 3 | 4
Как я могу опустить уровень «a» этого индекса, чтобы я в итоге:
б | с - + --- + - 0 | 1 | 2 1 | 3 | 4
droplevel
works может работать с многоуровневыми индексами или столбцами через параметрaxis
.Ответы:
Вы можете использовать
MultiIndex.droplevel
:источник
>>> df.columns = df.columns.droplevel(0)
>>> df.index = df.index.droplevel(1)
df.columns.droplevel()
больше не доступно.>>>df.columns = df.columns.droplevel(2) >>>df.columns = df.columns.droplevel(0)
Другой способ отбросить индекс - использовать понимание списка:
Эта стратегия также полезна, если вы хотите объединить имена с обоих уровней, как в примере ниже, где нижний уровень содержит два «у»:
Отбрасывание верхнего уровня оставило бы два столбца с индексом «у». Этого можно избежать, соединив имена с пониманием списка.
Это проблема, с которой я столкнулся после работы в группе, и потребовалось время, чтобы найти другой вопрос, который решил ее. Я адаптировал это решение к конкретному случаю здесь.
источник
[col[1] for col in df.columns]
это более прямоdf.columns.get_level_values(1)
.[col[0] if col[1] == '' else col[1] for col in df.columns]
Другой способ сделать это - переназначить
df
на основе поперечного сеченияdf
, используя метод .xs .источник
b
), затем опустите этот уровень и оставьте с первым уровнем (a
), сработает следующее:df = df.xs('b', axis=1, level=1, drop_level=True)
Начиная с Pandas 0.24.0 , теперь мы можем использовать DataFrame.droplevel () :
Это очень полезно, если вы хотите сохранить цепочку методов DataFrame.
источник
Вы также можете достичь этого, переименовав столбцы:
df.columns = ['a', 'b']
Это включает в себя ручной шаг, но может быть вариант, особенно если вы в конечном итоге переименовать свой фрейм данных.
источник
df.columns.get_level_values(1)
.Небольшой трюк, использующий
sum
уровень = 1 (работает, когда уровень = 1 уникален)Более распространенное решение
get_level_values
источник
Я боролся с этой проблемой, так как не знаю, почему моя функция droplevel () не работает. Проработайте несколько и узнайте, что «a» в вашей таблице - это имя столбца, а «b», «c» - индекс. Делать как это поможет
источник