Как создать столбец децилей в полярах Python?

Допустим, у меня есть столбец оценок FICO. Я хотел бы создать еще один столбец FICO_DECILE, который ранжирует оценки FICO по убыванию и назначает децильную группу, т. е. FICO=850 будет иметь FICO_DECILE=1, а что-то вроде FICO=360 будет иметь FICO_DECILE=10.

Я пытался:

# decile rank
df1 = df.with_columns(
    (
      (pl.col('fico').rank(method='dense')/df.height*10).cast(pl.UInt32).alias('fico_decile')
    )
)

Но я получаю только DECILE_GROUP, равный 0 и нулю.

Можете ли вы привести минимальный воспроизводимый пример?

Naveed Ahmed 05.09.2024 16:04
Почему в 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
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я не проверял, но это должно сработать, в целом я думаю, что вы на правильном пути. Основная причина, по которой вы получаете эту ошибку, заключается в том, как вы используете rank().

Хитрость в том, чтобы использовать descending: bool = False

Я изменил ваш код, чтобы включить это.

df1 = df.with_columns(
    (
        (pl.col('fico').rank(method='min', descending=True) / df.height * 10)
        .ceil()
        .cast(pl.UInt32)
        .alias('fico_decile')
    )
)

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

см. ссылку: горит

# filter out null FICO scores
fico_df = df.filter(pl.col('fico').is_not_null())

# rank for non-null FICO scores
fico_df = fico_df.with_columns(
    (
        (pl.col('fico')
         .rank(method='min', descending=True)  
         / fico_df.height * 10)  
        .ceil()
        .cast(pl.UInt32) 
        .alias('fico_decile')
    )
)

# handle null with lit 
null_fico_df = df.filter(pl.col('fico').is_null()).with_columns(
    pl.lit(None).alias('fico_decile')
)


# df with valid and invalid
df_final = pl.concat([fico_df, null_fico_df])

# results
df_final.select(['fico', 'fico_decile']).show()

@kstats9pt3 Думаю, даdescending=True см. ссылку

Derek Roberts 05.09.2024 16:18

Спасибо. Я думаю, что это близко, но не создает 10 групп. У меня есть группа, равная нулю, что имеет смысл, поскольку есть недопустимые фико, но после этого у меня есть только группы 1–8. Почему бы это не создать 11 групп (1-10 плюс ноль)?

kstats9pt3 05.09.2024 16:21

По-прежнему создается только 8 групп, 1–8, вместо 10 групп. Есть идеи, почему?

kstats9pt3 05.09.2024 16:29

@ kstats9pt3, хотите ли вы сохранить нулевые значения? Я подозреваю, что он игнорирует это, потому что вы не можете получить нулевой рейтинг, я думаю, либо вы находите способ изменить его на псевдоним.

Derek Roberts 05.09.2024 16:36

Я ссылался на полный фрейм данных с нулевыми значениями в ссылке height, так что теперь он отлично работает! Отмечу как ответ, еще раз спасибо.

kstats9pt3 05.09.2024 17:16

Ах @kstats9pt3 Я вижу, пожалуйста, всегда рад помочь :)

Derek Roberts 05.09.2024 17:49

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