Как создать категориальный столбец не в алфавитном порядке в Polars Dataframe?

В Pandas вы можете создать «упорядоченный» категориальный столбец из существующего строкового столбца следующим образом:

column_values_with_custom_order = ["B", "A", "C"] df["Column"] = pd.Categorical(df.Column, categories=column_values_with_custom_order, ordered=True)

В документации Polars я не смог найти такой способ создания упорядоченных столбцов. Однако я мог воспроизвести это с помощью pl.from_pandas(df), поэтому я подозреваю, что это возможно и с Polars.

Каким будет рекомендуемый способ для этого?

Я попытался создать новый столбец с помощью polars_df.with_columns(col("Column").cast(pl.categorical)), но я не знаю, как включить в него пользовательский порядок.

Еще проверила В полярах можно ли самому создать категориальный тип с уровнями?, но я бы предпочел не добавлять еще один столбец в свой Dataframe только для упорядочения.

Обратите внимание, что в связанном ответе в DataFrame не добавляется еще один столбец… просто создается небольшая серия с желаемым порядком, пока действует StringCache. Цель этой начальной серии - установить порядок строк и ничего больше. Его можно даже отбросить и никогда не добавлять в какой-либо DataFrame. Затем, пока тот же StringCache остается в силе, любые последующие столбцы категорий в любом DatFrame будут соблюдать порядок исходной серии, даже если серия была отброшена.

ΩΠΟΚΕΚΡΥΜΜΕΝΟΣ 09.02.2023 13:58

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

Eero H 09.02.2023 14:45
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
1
2
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из документа: Использовать:

polars_df.with_columns(col("Column").cast(pl.categorical).cat.set_ordering("lexical"))

Смотрите документ

df = pl.DataFrame(
    {"cats": ["z", "z", "k", "a", "b"], "vals": [3, 1, 2, 2, 3]}
).with_columns(
    [
        pl.col("cats").cast(pl.Categorical).cat.set_ordering("lexical"),
    ]
)
df.sort(["cats", "vals"])

Я полагаю, что это просто упорядочение по алфавиту? Что, если бы я хотел определить порядок как ["k", "z", "b", "a"]. Я не думаю, что это сработает тогда. Результат кода: форма: (5, 2) коты вальс кот i64 "а" 2 "б" 3 "к" 2 "г" 1 "г" 3

Eero H 09.02.2023 12:46

Я думаю, вы можете сделать set_ordering("physical"), но категории должны отображаться в том порядке, в котором вы хотите, чтобы они были.

0x26res 09.02.2023 13:48
Ответ принят как подходящий

Скажи, что у тебя есть

df = pl.DataFrame(
     {"cats": ["z", "z", "k", "a", "b"], "vals": [3, 1, 2, 2, 3]}
     )

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

myorder=["k", "z", "b", "a"]

Есть два способа сделать это. Один из способов — pl.StringCache(), как в вопросе, на который вы ссылаетесь, а другой — более запутанный. Первый не требует добавления каких-либо столбцов в ваш df. На самом деле очень лаконично.

with pl.StringCache():
    pl.Series(myorder).cast(pl.Categorical)
    df=df.with_columns(pl.col('cats').cast(pl.Categorical))

Что происходит, так это то, что все в StringCache получает одинаковые значения ключей, поэтому при приведении списка myorder сохраняется, какие ключи выделяются для каждого строкового значения. Когда ваш df попадает в тот же кеш, он получает те же значения ключа/строки, которые находятся в том порядке, в котором вы хотели.

Другой способ сделать это заключается в следующем:

Вы должны отсортировать свой df по порядку, тогда вы можете сделать set_ordering('physical'). Если вы хотите сохранить свой первоначальный порядок, вам просто нужно использовать with_row_count в начале, чтобы вы могли восстановить этот порядок.

Собрав все вместе, это выглядит так:

df=df.with_row_count('i').join(
        pl.from_dicts([{'order':x, 'cats':y} for x,y in enumerate(myorder)]), on='cats') \
    .sort('order').drop('order') \
    .with_columns(pl.col('cats').cast(pl.Categorical).cat.set_ordering('physical')) \
    .sort('i').drop('i')

Вы можете проверить, выполнив:

df.select(['cats',pl.col('cats').to_physical().alias('phys')])

shape: (5, 2)
┌──────┬──────┐
│ cats ┆ phys │
│ ---  ┆ ---  │
│ cat  ┆ u32  │
╞══════╪══════╡
│ z    ┆ 1    │
│ z    ┆ 1    │
│ k    ┆ 0    │
│ a    ┆ 3    │
│ b    ┆ 2    │
└──────┴──────┘

Спасибо за ясное объяснение! Это ответило на мой вопрос.

Eero H 09.02.2023 14:35

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

ANOVA для категориальных данных 4 группы в R studio
Как найти категориальные данные, где одна категория (включая NaN) представляет не менее 80% всех категорий переменных в Python Pandas?
Ggpredict с категориальной логистической регрессией в R
Серия Pandas - как проверить, что каждый элемент является категоричным
Перекодирование категориальной переменной на основе значения другой категориальной переменной в r кадре данных
Как использовать OrdinalEncoder() для установки пользовательского порядка?
Как преобразовать переменные str в отдельные категории в фрейме данных?
R: моделирование совокупности, в которой две категориальные переменные независимы
Использовать R для создания гистограммы категориальных значений растра? (или создайте таблицу данных со значениями широты/длины)
Как включить столбец для «всего» в гистограмму с накоплением для категориальной переменной в R

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

Как имитировать запросы Pandas на основе индекса в Polars?
Как одновременно анализировать последовательные шаблоны и выводить переменные из набора последовательностей?
Как на диаграмме рассеяния построить линию, которая является средним значением всех вертикальных координат точек данных с одинаковой координатой x
Pandas: чтение Excel с объединенными ячейками строк
Как я могу разделить свой фрейм данных по годам или месяцам
Конвейер с XGBoost — Imputer и Scaler предотвращают обучение модели
Python/Seaborn — как отображать имена каждого значения на диаграмме рассеяния
Как я могу добавить новый столбец в фрейм данных (df1), который представляет собой сумму нескольких значений поиска из df1 в другом фрейме данных (df2)
При извлечении текстовых данных из файлов в разных подкаталогах возникает ошибка «ValueError: подстрока не найдена»
Извлечение текстовых данных между ключевыми словами в строке