Предупреждение о производительности: удаление мультииндекса без лекссорной сортировки без параметра уровня может повлиять на производительность. Как избавиться от этого?

У меня есть следующая строка кода

 end_df['Soma Internet'] = end_df.iloc[:,end_df.columns.get_level_values(1) == 'Internet'].drop('site',axis=1).sum(axis=1)

По сути, он фильтрует мой многоиндексный df по определенному столбцу уровня 1. Отбрасывает несколько нежелательных столбцов. И делает сумму всех остальных.

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуем на примере (без данных для простоты):

# Column MultiIndex.
idx = pd.MultiIndex(levels=[['Col1', 'Col2', 'Col3'], ['subcol1', 'subcol2']], 
                    codes=[[2, 1, 0], [0, 1, 1]])

df = pd.DataFrame(columns=range(len(idx)))
df.columns = idx
print(df)
    Col3    Col2    Col1
subcol1 subcol2 subcol2

Ясно, что столбец MultiIndex не отсортирован. Мы можем проверить это с помощью:

print(df.columns.is_monotonic)
False

Это важно, потому что Pandas выполняет поиск индекса и другие операции намного быстрее, если индекс отсортирован, потому что он может использовать операции, которые предполагают порядок сортировки и выполняются быстрее. Действительно, если мы попытаемся удалить столбец:

df.drop('Col1', axis=1)
PerformanceWarning: dropping on a non-lexsorted multi-index without a level parameter may impact performance.
  df.drop('Col1', axis=1)

Вместо этого, если мы отсортируем индекс перед удалением, предупреждение исчезнет:

print(df.sort_index(axis=1))

# Index is now sorted in lexical order.
    Col1    Col2    Col3
subcol2 subcol2 subcol1
# No warning here.
df.sort_index(axis=1).drop('Col1', axis=1)

РЕДАКТИРОВАТЬ (см. комментарии): Как следует из предупреждения, это происходит, когда мы не указываем уровень, с которого мы хотим удалить столбец. Это связано с тем, что для удаления столбца pandas должен пройти весь несортированный индекс (происходит здесь). Указав его, нам не нужен такой обход:

# Also no warning.
df.drop('Col1', axis=1, level=0)

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

Просто из любопытства, что вы имеете в виду под лексической сортировкой? Я спрашиваю об этом, потому что, когда я убедился в методе перетаскивания уровня столбца, ошибка исчезла .drop('Site', level=0)

INGl0R1AM0R1 17.05.2022 20:32

@ INGl0R1AM0R1 это означает, что отсортировано в лексикографический порядок (в основном «в алфавитном порядке»)

user2246849 17.05.2022 20:50

@ INGl0R1AM0R1 Я отредактировал ответ, как обсуждалось.

user2246849 17.05.2022 21:17

Другие вопросы по теме