Я пытаюсь отсортировать раздел категориальных данных из набора данных kaggle Цены на жилье. Я пытаюсь отсортировать столбцы по количеству уникальных категорий. Чтобы не загромождать вопрос, я включил небольшой раздел фрейма данных (всего 80 столбцов), чтобы продемонстрировать проблему.
LotConfig Street MSZoning
0 Inside Pave RL
1 FR2 Pave RL
2 Corner Grvl RL
Я стремлюсь отсортировать столбцы для достижения следующего результата.
MSZoning Street LotConfig
0 RL Pave Inside
1 RL Pave FR2
2 RL Grvl Corner
В настоящее время я использую следующий код.
sorted_categories = sorted(df.columns, key = lambda col: df[col].nunique())
df = df[sorted_categories]
Есть ли лучший способ решить эту проблему? Мне не хватает метода pandas для достижения этого?
Вы можете вызвать nunique
напрямую и проиндексировать свой исходный DataFrame, используя результат:
u = df.nunique().sort_values().index
df[u]
MSZoning Street LotConfig
0 RL Pave Inside
1 RL Pave FR2
2 RL Grvl Corner
df.nunique()
вернет серию уникальных значений для каждого столбца.
>>> df.nunique()
LotConfig 3
Street 2
MSZoning 1
dtype: int64
Однако, на вашем небольшом примере ваш подход на самом деле быстрее моего, хотя и немного более многословный. Я бы проверил это на вашем реальном DataFrame, поскольку ваш метод не является неправильным, и если он улучшит производительность, я бы вместо этого использовал его. Я считаю, что мой метод должен работать быстрее на большом кадре, поскольку он позволяет избежать многократных вызовов nunique
.
Таким образом, для фактического DataFrame метод
sorted(code)
принимает4.5 ms ± 42 µs per loop
, аdf.nunique().sort_values().index
принимает6.33 ms ± 51.5 µs per loop
. Мне было интересно, как это будет масштабироваться, как вы упомянули. Должен ли я изменить свой вопрос с результатами для гораздо большего DataFrame? Недостаточно места в поле для комментариев. Не имея доступа к аналогичному категориальному DataFrame, я просто повторил существующий DataFrame и выполнил ту же операцию