Как избавиться от мультииндекса pandas

Содержание
  1. Иерархическое индексирование и уровни признаков / pd 6
  2. Изменение порядка и сортировка уровней
  3. Общая статистика по уровню
  4. Pandas: избавление от мультииндекса
  5. 2 ответа
  6. Похожие вопросы:
  7. Pandas reset inner level of MultiIndex
  8. 4 Answers 4
  9. New Answer
  10. OLD ANSWER
  11. Do Not Use
  12. You can use pandas.MultiIndex.set_levels
  13. One-line
  14. In place
  15. Not the answer you’re looking for? Browse other questions tagged python pandas or ask your own question.
  16. Related
  17. Hot Network Questions
  18. Subscribe to RSS
  19. Pandas: избавление от мультииндекса
  20. 2 ответа
  21. Похожие вопросы:
  22. Выберите строки в pandas MultiIndex DataFrame
  23. Пример ввода:
  24. Вопрос 1: выбор одного предмета
  25. Вопрос 2: выбор нескольких значений на уровне
  26. Вопрос 3: разрезание одного поперечного сечения (x, y)
  27. Вопрос 4: Нарезка нескольких поперечных сечений [(a, b), (c, d), . ]
  28. Вопрос 5: по одному предмету на каждый уровень
  29. Вопрос 6: произвольное нарезание
  30. Вопрос 7: Фильтрация по числовому неравенству на отдельных уровнях мультииндекса
  31. MultiIndex / Расширенное индексирование
  32. Вопрос 1
  33. Вопрос 1b
  34. вопрос 2
  35. Вопрос 2b
  36. Вопрос 3
  37. Вопрос 4
  38. Вопрос 5
  39. Вопрос 6
  40. Вопрос 7
  41. Бонусный вопрос

Иерархическое индексирование и уровни признаков / pd 6

Иерархическое индексирование — это важная особенность pandas, поскольку она позволяет иметь несколько уровней индексов в одной оси. С ее помощью можно работать с данными в большом количестве измерений, по-прежнему используя для этого структуру данных из двух измерений.

Начнем с простого примера, создав Series с двумя массивами индексов — структуру с двумя уровнями.

За счет спецификации иерархического индексирования, выбор подмножеств значений в таком случае заметно упрощен. Можно выбрать значения для определенного значения первого индекса стандартным способом:

Или же значения для конкретного значения во втором индекса — таким:

Если необходимо конкретное значение, просто указываются оба индекса.

Иерархическое индексирование играет важную роль в изменении формы данных и групповых операциях, таких как сводные таблицы. Например, данные могут быть перестроены и использованы в объекте Dataframe с помощью функции unstack() . Она конвертирует Series с иерархическими индексами в простой Dataframe , где второй набор индексов превращается в новые колонки.

down left right up
blue 0.408367 NaN NaN 0.081480
red 0.374153 0.325975 NaN 0.465264
white 0.512268 NaN 0.639885 0.661039

Если необходимо выполнить обратную операцию — превратить Dataframe в Series , — используется функция stack() .

ball pen pencil paper
red 0 1 2 3
blue 4 5 6 7
yellow 8 9 10 11
white 12 13 14 15

В Dataframe можно определить иерархическое индексирование для строк и колонок. Для этого необходимо определить массив массивов для параметров index и columns .

pen paper
1 2 1 2
white up 1.562883 0.919727 -0.397509 -0.314159
down 0.580848 1.124744 0.741454 -0.035455
red up -1.721348 0.989703 -1.454304 -0.249718
down -0.113246 -0.441528 -0.105028 0.285786

Изменение порядка и сортировка уровней

Иногда потребуется поменять порядок уровней на оси или отсортировать значения на определенном уровне.

Функция swaplevel() принимает в качестве аргументов названия уровней, которые необходимо поменять относительно друг друга и возвращает новый объект с соответствующими изменениями, оставляя данные в том же состоянии.

objects pen paper
id 1 2 1 2
colors status
white up 1.562883 0.919727 -0.397509 -0.314159
down 0.580848 1.124744 0.741454 -0.035455
red up -1.721348 0.989703 -1.454304 -0.249718
down -0.113246 -0.441528 -0.105028 0.285786
objects pen paper
id 1 2 1 2
status colors
up white 1.562883 0.919727 -0.397509 -0.314159
down white 0.580848 1.124744 0.741454 -0.035455
up red -1.721348 0.989703 -1.454304 -0.249718
down red -0.113246 -0.441528 -0.105028 0.285786

А функция sort_index() сортирует данные для конкретного уровня, указанного в параметрах.

objects pen paper
id 1 2 1 2
colors status
red down -0.113246 -0.441528 -0.105028 0.285786
up -1.721348 0.989703 -1.454304 -0.249718
white down 0.580848 1.124744 0.741454 -0.035455
up 1.562883 0.919727 -0.397509 -0.314159

Общая статистика по уровню

У многих статистических методов для Dataframe есть параметр level , в котором нужно определить, для какого уровня нужно определить статистику.

Например, если нужна статистика для первого уровня, его нужно указать в параметрах.

objects pen paper
id 1 2 1 2
colors
white 2.143731 2.044471 0.343945 -0.349614
red -1.834594 0.548174 -1.559332 0.036068

Если же она необходима для конкретного уровня колонки, например, id , тогда требуется задать параметр axis и указать значение 1.

Источник

Pandas: избавление от мультииндекса

После группировки и подсчета dataframe я пытаюсь удалить мультииндекс следующим образом:

Печать столбцов ( df.colums ) показывает, что это все еще MultiIndex .

Я не могу получить доступ к столбцу CID через df[‘CID’] .

2 ответа

Дано: mi1 = MultiIndex.from_tuples([(‘bar’, ‘y’), (‘bar’, ‘z’), (‘baz’, ‘y’), (‘baz’, ‘z’), (‘foo’, ‘y’), (‘foo’, ‘z’)]) dfa = DataFrame(random.rand(6),index=mi1) Как Сортировать по некоторым столбцам и некоторым уровням мультииндекса одновременно (в данном случае, скажем, по уровню 1.

В Pandas я пытаюсь отфильтровать строки с определенными датами (заданными как первый уровень мультииндекса) в dataframe. После фильтрации я хотел бы проверить, совпадает ли последнее значение индекса для первого уровня с моей последней датой. Однако я не могу заставить Pandas вернуть правильное.

Я думаю, вам нужно, если это необходимо, преобразовать MultiIndex в Index :

Или, если нужно, удалите уровень использования droplevel :

Если вам нужен доступ к значениям, используйте xs :

Вы также можете проверить:

Для удаления MultiIndex-это еще одно решение, выбранное [‘FID’] .

Образцы (также добавлено rename_axis для более приятного вывода):

Это должно избавиться от MultiIndex для CID и позволить вам получить доступ к нему через df[‘CID’]

Похожие вопросы:

У меня есть dataframe, например: Year Value Country Element Item ItemCode Afghanistan Production Wheat and products 2511 1961 2279 1962 2279 1963 1947 1964 2230 1965 2282 Я хотел бы удалить уровень.

У меня есть dataframe с Мультииндексом, и я хотел бы изменить один конкретный уровень Мультииндекса. Например, первый уровень может быть строками, и я могу захотеть удалить пробелы с этого уровня.

У меня есть многоиндексный фрейм данных со столбцами ‘A’ и ‘B’. Есть ли способ выбрать строки путем фильтрации по одному столбцу мультииндекса без сброса индекса к индексу одного столбца? например.

Дано: mi1 = MultiIndex.from_tuples([(‘bar’, ‘y’), (‘bar’, ‘z’), (‘baz’, ‘y’), (‘baz’, ‘z’), (‘foo’, ‘y’), (‘foo’, ‘z’)]) dfa = DataFrame(random.rand(6),index=mi1) Как Сортировать по некоторым.

В Pandas я пытаюсь отфильтровать строки с определенными датами (заданными как первый уровень мультииндекса) в dataframe. После фильтрации я хотел бы проверить, совпадает ли последнее значение.

Я установил DataFrame с двумя индексами. Но нарезка ведет себя не так, как ожидалось. Я понимаю, что это очень простая проблема, поэтому я искал похожие вопросы: pandas: срез a MultiIndex по.

Я пытаюсь использовать метод replace несколько раз, чтобы изменить индексы данного уровня мультииндекса pandas’ dataframe. Как видно здесь: Pandas: модифицируйте определенный уровень Мультииндекса .

Я пытаюсь отфильтровать dataframe с помощью мультииндекса, аналогичного следующему. import numpy as np import pandas as pd data = pd.DataFrame(np.random.rand(8), index=[list(‘AABBCCDD’), [‘M’.

Я хочу добавить имя индекса мультииндекса dataframe. Я хочу установить имя красного ящика в изображении как ‘Ticker’ Как я могу это сделать?

В фрейме данных pandas я хочу добавить столбец var3 , который является минимумом целого числа и столбца var1 . Однако этот столбец является частью мультииндекса, который я создаю с помощью unstack().

Источник

Pandas reset inner level of MultiIndex

I have a DF in the following format:

And I want to reset the ‘Date’ index giving the following:

I thought simply df.reset_index(level=’Date’, inplace=True, drop=True) would do it, but it does not.

4 Answers 4

Using pd.MultiIndex.from_arrays and groupby + cumcount .

This won’t generalise to N levels, but there should be a df.index.set_levels equivalent I’m forgetting.

Using set_index and cumcount :

You can groupby ID , then reset the index on each group using apply :

New Answer

Not as cool as the old answer but I’d rather be accurate than cool.

OLD ANSWER

Do Not Use

I misread the question. I didn’t see that the new index needed to reset for every group.

Hopefully useful to someone.

You can use pandas.MultiIndex.set_levels

One-line

In place

Not the answer you’re looking for? Browse other questions tagged python pandas or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.11.1.40614

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Pandas: избавление от мультииндекса

После группировки и подсчета dataframe я пытаюсь удалить мультииндекс следующим образом:

Печать столбцов ( df.colums ) показывает, что это все еще MultiIndex .

Я не могу получить доступ к столбцу CID через df[‘CID’] .

2 ответа

Дано: mi1 = MultiIndex.from_tuples([(‘bar’, ‘y’), (‘bar’, ‘z’), (‘baz’, ‘y’), (‘baz’, ‘z’), (‘foo’, ‘y’), (‘foo’, ‘z’)]) dfa = DataFrame(random.rand(6),index=mi1) Как Сортировать по некоторым столбцам и некоторым уровням мультииндекса одновременно (в данном случае, скажем, по уровню 1.

В Pandas я пытаюсь отфильтровать строки с определенными датами (заданными как первый уровень мультииндекса) в dataframe. После фильтрации я хотел бы проверить, совпадает ли последнее значение индекса для первого уровня с моей последней датой. Однако я не могу заставить Pandas вернуть правильное.

Я думаю, вам нужно, если это необходимо, преобразовать MultiIndex в Index :

Или, если нужно, удалите уровень использования droplevel :

Если вам нужен доступ к значениям, используйте xs :

Вы также можете проверить:

Для удаления MultiIndex-это еще одно решение, выбранное [‘FID’] .

Образцы (также добавлено rename_axis для более приятного вывода):

Это должно избавиться от MultiIndex для CID и позволить вам получить доступ к нему через df[‘CID’]

Похожие вопросы:

У меня есть dataframe, например: Year Value Country Element Item ItemCode Afghanistan Production Wheat and products 2511 1961 2279 1962 2279 1963 1947 1964 2230 1965 2282 Я хотел бы удалить уровень.

У меня есть dataframe с Мультииндексом, и я хотел бы изменить один конкретный уровень Мультииндекса. Например, первый уровень может быть строками, и я могу захотеть удалить пробелы с этого уровня.

У меня есть многоиндексный фрейм данных со столбцами ‘A’ и ‘B’. Есть ли способ выбрать строки путем фильтрации по одному столбцу мультииндекса без сброса индекса к индексу одного столбца? например.

Дано: mi1 = MultiIndex.from_tuples([(‘bar’, ‘y’), (‘bar’, ‘z’), (‘baz’, ‘y’), (‘baz’, ‘z’), (‘foo’, ‘y’), (‘foo’, ‘z’)]) dfa = DataFrame(random.rand(6),index=mi1) Как Сортировать по некоторым.

В Pandas я пытаюсь отфильтровать строки с определенными датами (заданными как первый уровень мультииндекса) в dataframe. После фильтрации я хотел бы проверить, совпадает ли последнее значение.

Я установил DataFrame с двумя индексами. Но нарезка ведет себя не так, как ожидалось. Я понимаю, что это очень простая проблема, поэтому я искал похожие вопросы: pandas: срез a MultiIndex по.

Я пытаюсь использовать метод replace несколько раз, чтобы изменить индексы данного уровня мультииндекса pandas’ dataframe. Как видно здесь: Pandas: модифицируйте определенный уровень Мультииндекса .

Я пытаюсь отфильтровать dataframe с помощью мультииндекса, аналогичного следующему. import numpy as np import pandas as pd data = pd.DataFrame(np.random.rand(8), index=[list(‘AABBCCDD’), [‘M’.

Я хочу добавить имя индекса мультииндекса dataframe. Я хочу установить имя красного ящика в изображении как ‘Ticker’ Как я могу это сделать?

В фрейме данных pandas я хочу добавить столбец var3 , который является минимумом целого числа и столбца var1 . Однако этот столбец является частью мультииндекса, который я создаю с помощью unstack().

Источник

Выберите строки в pandas MultiIndex DataFrame

Каковы наиболее распространенные способы выбора / фильтрации строк фрейма данных, индекс которого является MultiIndex ?

  • Нарезка на основе одного значения / метки
  • Нарезка на основе нескольких этикеток с одного или нескольких уровней
  • Фильтрация по логическим условиям и выражениям
  • Какие методы применимы в каких обстоятельствах

Предположения для простоты:

  1. входной фрейм данных не имеет повторяющихся ключей индекса
  2. Фреймворк входных данных ниже имеет только два уровня. (Большинство решений, показанных здесь, обобщаются до N уровней)

Пример ввода:

Вопрос 1: выбор одного предмета

Как выбрать строки со знаком «а» на уровне «один»?

Кроме того, как я могу сбросить уровень «один» на выходе?

Вопрос 1b
Как мне нарезать все строки со значением «t» на уровне «два»?

Вопрос 2: выбор нескольких значений на уровне

Как выбрать строки, соответствующие элементам «b» и «d» на уровне «один»?

Вопрос 2b
Как мне получить все значения, соответствующие «t» и «w» на уровне «два»?

Вопрос 3: разрезание одного поперечного сечения (x, y)

Как мне получить поперечное сечение, т. Е. Одну строку, имеющую определенные значения для индекса df ? В частности, как мне получить поперечное сечение (‘c’, ‘u’) , заданное

Вопрос 4: Нарезка нескольких поперечных сечений [(a, b), (c, d), . ]

Как выбрать две строки, соответствующие (‘c’, ‘u’) , и (‘a’, ‘w’) ?

Вопрос 5: по одному предмету на каждый уровень

Как я могу получить все строки, соответствующие «a» на уровне «один» или «t» на уровне «два»?

Вопрос 6: произвольное нарезание

Как я могу разрезать определенные поперечные сечения? Для «a» и «b» я хотел бы выбрать все строки с подуровнями «u» и «v», а для «d» я хотел бы выбрать строки с подуровнем «w».

Вопрос 7 будет использовать уникальную настройку, состоящую из числового уровня:

Вопрос 7: Фильтрация по числовому неравенству на отдельных уровнях мультииндекса

Как получить все строки, в которых значения на уровне «два» больше 5?

Примечание. В этом посте не будет рассказываться о том, как создавать мультииндексы, как выполнять над ними операции присваивания, или какие-либо обсуждения, связанные с производительностью (это отдельные темы в другой раз).

MultiIndex / Расширенное индексирование

Примечание.
Этот пост будет структурирован следующим образом:

  1. Вопросы, поставленные в OP, будут рассмотрены один за другим.
  2. Для каждого вопроса будет продемонстрирован один или несколько методов, применимых к решению этой проблемы и получению ожидаемого результата.

Примечания (очень похожие на это) будут включены для читателей, заинтересованных в изучении дополнительных функций, деталей реализации и другой информации, кратко связанной с рассматриваемой темой. Эти заметки были составлены путем просмотра документов и выявления различных малоизвестных функций, а также на основе моего собственного (правда, ограниченного) опыта.

Все примеры кода созданы и протестированы на pandas v0.23.4, python3.7 . Если что-то неясно или фактически неверно, или если вы не нашли решения, применимого к вашему варианту использования, пожалуйста, не стесняйтесь предлагать редактирование, запрашивать разъяснения в комментариях или открывать новый вопрос, . в зависимости от ситуации ,

Вот введение в некоторые распространенные идиомы (далее именуемые «Четыре идиомы»), которые мы будем часто посещать повторно.

DataFrame.loc — Общее решение для выбора по метке (+ pd.IndexSlice для более сложных приложений, включающих срезы)

DataFrame.xs — Извлечь конкретное поперечное сечение из серии / фрейма данных.

DataFrame.query — Укажите операции нарезки и / или фильтрации динамически (т. Е. Как выражение, которое оценивается динамически. Более применимо к некоторым сценариям, чем к другим. Также см. Этот раздел документации для запросов по MultiIndexes.

Логическое индексирование с маской, сгенерированной с использованием MultiIndex.get_level_values (часто вместе с Index.isin , особенно при фильтрации с несколькими значениями). Это также весьма полезно в некоторых случаях.

Будет полезно взглянуть на различные проблемы нарезки и фильтрации с точки зрения Четырех идиом, чтобы лучше понять, что можно применить к данной ситуации. Очень важно понимать, что не все идиомы будут работать одинаково хорошо (если вообще будут работать) в любых обстоятельствах. Если идиома не указана в качестве потенциального решения проблемы ниже, это означает, что идиома не может быть эффективно применена к этой проблеме.

Вопрос 1

Как выбрать строки со знаком «а» на уровне «один»?

В loc качестве универсального решения, применимого в большинстве ситуаций, вы можете использовать :

На этом этапе, если вы получите

Это означает, что вы используете старую версию pandas. Рассмотрите возможность обновления! В противном случае используйте df.loc[(‘a’, slice(None)), :] .

В качестве альтернативы вы можете использовать xs здесь, так как мы извлекаем одно поперечное сечение. Обратите внимание , что levels и axis аргументы (разумные значения по умолчанию можно считать здесь).

Здесь drop_level=False аргумент необходим, чтобы предотвратить xs падение уровня «один» в результате (уровень, на который мы нарезали).

Еще один вариант — использовать query :

Если у индекса не было имени, вам нужно было бы изменить строку запроса на «ilevel_0 == ‘a'» .

Наконец, используя get_level_values :

Кроме того, как я могу сбросить уровень «один» на выходе?

Это легко сделать, используя либо

Обратите внимание, что мы можем опустить drop_level аргумент (предполагается, что он True по умолчанию).

Примечание.
Вы можете заметить, что отфильтрованный DataFrame может по-прежнему иметь все уровни, даже если они не отображаются при выводе DataFrame. Например,

Вопрос 1b

Как нарезать все строки со значением «t» на уровне «два»?

Интуитивно вам может понадобиться что-то, включающее slice() :

Это просто работает! ™ Но это неуклюже. Используя pd.IndexSlice API, мы можем облегчить более естественный синтаксис нарезки .

Это намного чище.

Примечание.
Почему : требуется завершающий фрагмент по столбцам? Это потому, что, loc может использоваться для выбора и нарезки по обеим осям ( axis=0 или axis=1 ). Без явного указания на то, по какой оси должна выполняться нарезка, операция становится неоднозначной. Смотрите большую красную рамку в документации по нарезке .

Если вы хотите убрать оттенок двусмысленности, loc принимает axis параметр:

Без axis параметра (то есть просто путем выполнения df.loc[pd.IndexSlice[:, ‘t’]] ) предполагается, что нарезка выполняется по столбцам, и в этом KeyError случае будет повышен a .

Это задокументировано в слайсерах . Однако для целей этой публикации мы явно укажем все оси.

И, наконец get_level_values , вы можете сделать

вопрос 2

Как выбрать строки, соответствующие элементам «b» и «d» на уровне «один»?

Используя loc, это делается аналогичным образом путем указания списка.

Чтобы решить указанную выше проблему выбора «b» и «d», вы также можете использовать query :

Примечание.
Да, синтаксический анализатор по умолчанию — это ‘pandas’ , но важно подчеркнуть, что этот синтаксис традиционно не является python. Парсер Pandas генерирует дерево синтаксического анализа, немного отличающееся от выражения. Это сделано для того, чтобы сделать некоторые операции более интуитивно понятными. Для получения дополнительной информации прочтите мой пост о динамической оценке выражений в pandas с использованием pd.eval () .

И, с get_level_values + Index.isin :

Вопрос 2b

Как мне получить все значения, соответствующие «t» и «w» на уровне «два»?

С loc , это возможно только в сочетании с pd.IndexSlice .

Первый двоеточие : в pd.IndexSlice[:, [‘t’, ‘w’]] средство нарезать поперек первого уровня. По мере увеличения глубины запрашиваемого уровня вам потребуется указать больше срезов, по одному на каждый уровень. Однако вам не нужно указывать дополнительные уровни, помимо того, который нарезается.

С помощью get_level_values и Index.isin (аналогично приведенному выше):

Вопрос 3

Как мне получить поперечное сечение, т. Е. Одну строку, имеющую определенные значения для индекса df ? В частности, как мне получить поперечное сечение (‘c’, ‘u’) , заданное

Используйте loc , указав кортеж ключей:

Примечание.
На этом этапе вы можете столкнуться с PerformanceWarning таким:

Это просто означает, что ваш индекс не отсортирован. pandas зависит от сортируемого индекса (в данном случае лексикографически, поскольку мы имеем дело со строковыми значениями) для оптимального поиска и извлечения. Быстрое решение — заранее отсортировать DataFrame, используя DataFrame.sort_index . Это особенно желательно с точки зрения производительности, если вы планируете выполнять несколько таких запросов в тандеме:

Вы также можете использовать, MultiIndex.is_lexsorted() чтобы проверить, отсортирован ли индекс или нет. Эта функция возвращает True или False соответственно. Вы можете вызвать эту функцию, чтобы определить, требуется ли дополнительный этап сортировки.

С xs , это снова просто передача одного кортежа в качестве первого аргумента, при этом для всех остальных аргументов установлены соответствующие значения по умолчанию:

С query , все становится немного неуклюже:

Теперь вы видите, что обобщить это будет относительно сложно. Но все еще подходит для этой конкретной проблемы.

При доступе, охватывающем несколько уровней, get_level_values все еще можно использовать, но не рекомендуется:

Вопрос 4

Как выбрать две строки, соответствующие (‘c’, ‘u’) , и (‘a’, ‘w’) ?

С loc , это все так же просто, как:

С query , вам нужно будет динамически генерировать строку запроса, перебирая ваши сечения и уровни:

100% НЕ РЕКОМЕНДУЕМ! Но это возможно.

Вопрос 5

Как я могу получить все строки, соответствующие «a» на уровне «один» или «t» на уровне «два»?

На самом деле это очень сложно сделать loc , обеспечивая при этом правильность и при этом сохраняя ясность кода. df.loc[pd.IndexSlice[‘a’, ‘t’]] неверно, это интерпретируется как df.loc[pd.IndexSlice[(‘a’, ‘t’)]] (т.е. выбор сечения). Вы можете подумать о решении, pd.concat позволяющем обрабатывать каждую метку отдельно:

Но вы заметите, что одна из строк дублируется. Это потому, что эта строка удовлетворяла обоим условиям нарезки и поэтому появлялась дважды. Вместо этого вам нужно будет сделать

Но если ваш DataFrame по своей сути содержит повторяющиеся индексы (которые вы хотите), то это не сохранит их. Используйте с особой осторожностью .

С query , это глупо просто:

С get_level_values , это все еще просто, но не так элегантно:

Вопрос 6

Как я могу разрезать определенные поперечные сечения? Для «a» и «b» я хотел бы выбрать все строки с подуровнями «u» и «v», а для «d» я хотел бы выбрать строки с подуровнем «w».

Это особый случай, который я добавил, чтобы помочь понять применимость Четырех идиом — это тот случай, когда ни одна из них не будет работать эффективно, поскольку нарезка очень специфична и не соответствует никакому реальному шаблону.

Обычно для решения подобных задач требуется явная передача списка ключей в loc . Один из способов сделать это:

Если вы хотите сэкономить на вводе текста, вы узнаете, что существует шаблон для нарезки «a», «b» и его подуровней, поэтому мы можем разделить задачу нарезки на две части и concat результат:

Спецификация нарезки для «a» и «b» немного чище, ((‘a’, ‘b’), (‘u’, ‘v’)) потому что одни и те же индексируемые подуровни одинаковы для каждого уровня.

Вопрос 7

Как получить все строки, в которых значения на уровне «два» больше 5?

Это можно сделать, используя query ,

Примечание.
Как и в этом примере, мы можем фильтровать по любому произвольному условию, используя эти конструкции. В общем, полезно помнить, что loc и xs предназначены специально для индексирования на основе меток, а query и get_level_values полезны для создания общих условных масок для фильтрации.

Бонусный вопрос

Что, если мне нужно разрезать MultiIndex столбец ?

Собственно, большинство решений здесь применимо и к столбцам с небольшими изменениями. Рассматривать:

Вот следующие изменения, которые вам нужно будет внести в Четыре идиомы, чтобы они работали со столбцами.

Чтобы нарезать loc , используйте

Для использования по xs мере необходимости просто передайте аргумент axis=1 .

Вы можете получить доступ к значениям уровня столбца напрямую, используя df.columns.get_level_values . Затем вам нужно будет сделать что-то вроде

Где представляет собой некоторое условие, построенное с использованием columns.get_level_values .

Для использования query , единственным вариантом является транспонировать, запрос по индексу, и транспонировать снова:

Не рекомендуется использовать один из трех других вариантов.

Недавно я столкнулся со случаем использования, когда у меня был трехуровневый мультииндексный фрейм данных, в котором я не мог заставить ни одно из вышеперечисленных решений дать результаты, которые я искал. Вполне возможно, что приведенные выше решения, конечно, работают для моего варианта использования, и я попробовал несколько, однако мне не удалось заставить их работать в то время, которое у меня было.

Я далек от эксперта, но я наткнулся на решение, которое не было указано в исчерпывающих ответах выше. Я не гарантирую, что решения в любом случае оптимальны.

Это другой способ получить результат, немного отличный от вопроса № 6 выше. (и, вероятно, другие вопросы)

В частности, я искал:

  1. Способ выбора двух + значений из одного уровня индекса и одного значения из другого уровня индекса, и
  2. Способ оставить значения индекса из предыдущей операции в выводе фрейма данных.

Как гаечный ключ в шестернях (однако полностью поправимый):

  1. Индексы были безымянными.

На фрейме данных игрушки ниже:

Конечно, с помощью приведенных ниже работ:

Но мне нужен был другой результат, поэтому мой метод получения этого результата был следующим:

И если бы я хотел два + значения с одного уровня и одно (или 2+) значение с другого уровня:

Вышеупомянутый метод, вероятно, немного неуклюж, но я обнаружил, что он удовлетворяет мои потребности и, как бонус, мне было легче понять и прочитать.

Источник

Читайте также:  Как избавится от уплотнений под кожей
Оцените статью
Избавляемся от вредителей