У меня есть следующая строка кода
end_df['Soma Internet'] = end_df.iloc[:,end_df.columns.get_level_values(1) == 'Internet'].drop('site',axis=1).sum(axis=1)
По сути, он фильтрует мой многоиндексный df по определенному столбцу уровня 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)
Однако в целом эта проблема больше связана с индексами строк, поскольку обычно мультииндексы столбцов намного меньше. Но обязательно иметь это в виду для больших индексов и фреймов данных. На самом деле это особенно актуально для нарезка по индексу и для поиска. В этих случаях вы хотите, чтобы ваш индекс был отсортирован для повышения производительности.
@ INGl0R1AM0R1 это означает, что отсортировано в лексикографический порядок (в основном «в алфавитном порядке»)
@ INGl0R1AM0R1 Я отредактировал ответ, как обсуждалось.
Просто из любопытства, что вы имеете в виду под лексической сортировкой? Я спрашиваю об этом, потому что, когда я убедился в методе перетаскивания уровня столбца, ошибка исчезла .drop('Site', level=0)