Панда рейтинг: переместить определенное значение вниз - PullRequest
1 голос
/ 30 апреля 2020

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

    Id Score1 Score2 Score3
    1    5       0      8 
    2   -4       2      6
    3    3       1      5
    4    0      -4     -3

w1, w2, w3 = 0.4, 0,3, 0.3
boolean1, boolean2, boolean3 = True, False, True
df['tmp_rank1'] = df[Score1].rank(ascending=boolean1)
df['tmp_rank2'] = df[Score2].rank(ascending=boolean2)
df['tmp_rank3'] = df[Score3].rank(ascending=boolean3)
df['final_rank'] = df['tmp_rank1'] * w1 + df['tmp_rank2'] * w2 + df['tmp_rank3'] * w3

1 Ответ

1 голос
/ 30 апреля 2020

IIU C, я думаю, вы можете использовать mask для замены 0 на nan перед созданием rank и na_option, но никогда не присваивайте nan обратно исходному столбцу

w1, w2, w3 = 0.4, 0.3, 0.3
boolean1, boolean2, boolean3 = True, False, True
df['tmp_rank1'] = df['Score1'].mask(df['Score1'].eq(0))\
                              .rank(ascending=boolean1, na_option='bottom')
df['tmp_rank2'] = df['Score2'].mask(df['Score2'].eq(0))\
                              .rank(ascending=boolean2, na_option='bottom')
df['tmp_rank3'] = df['Score3'].mask(df['Score3'].eq(0))\
                              .rank(ascending=boolean3, na_option='bottom')
df['final_rank'] = df['tmp_rank1'] * w1 + df['tmp_rank2'] * w2 + df['tmp_rank3'] * w3
...