У меня есть следующий фреймворк pandas

Suburb       Percentile Rank
Hume          0.20464135
Clayton       0.409162146
Moorabin      0.654550934
St Kilda      0.80464135
Point Cook   1.505447257

Я хочу создать новую колонку под названием Rank Classier на основе значения столбца «Раминило».

Правила будут выглядеть так;

perc_rank <= 0.2 then 'Very Low', 
perc_rank > 0.2 and perc_rank <= 0.4 then 'Low', 
perc_rank > 0.4 and perc_rank <= 0.6 then 'Medium', 
perc_rank > 0.6 and perc_rank <= 0.8 then 'High', 
perc_rank > 0.8 and perc_rank <= 1.0 then 'Very High'

Я смог произвести выход классификатора в SQL. Но не в состоянии сделать то же самое, используя Python с созданием нового столбца.

Попробовал это;

def Rank Classifier

     if (perc_rank  <= 0.2):
               Rank Classifier = "Very Low"
            elif (perc_rank > 2) & (perc_rank <= 0.4):
                Rank Classifier = "Low"
            elif (perc_rank > 0.4) & (perc_rank  <= 0.6):
                Rank Classifier = "Medium"
            elif (perc_rank  > 0.6) & (perc_rank <= 0.8):
                Rank Classifier = "High"
            elif (perc_rank > 8) & (perc_rank <=1 ):
                Rank Classifier = "Very High"
                
        else:
            return Rank Classifier

Получение ошибки «indentationError: undentent не соответствует ни одному наружному уровню отступа»

Хотелось бы вернуть данные классификатора в новом столбце под названием «Ранг классификатор»

Результат будет выглядеть следующим образом:

Suburb  Percentile Rank  Rank Classifier
Hume        0.20464135      Very Low
Clayton     0.409162146     Low
Moorabin    0.654550934    Medium
St Kilda    0.80464135     High
Point Cook  1.505447257    Very High

Любая помощь будет оценена !!!

Заранее спасибо

1
adey27 3 Июн 2021 в 03:02

2 ответа

Лучший ответ

Вместо того, чтобы применять функцию, посмотрите на использование pandas.cut.

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

bins = [0.2, 0.4, 0.6, 0.8, 1, np.inf]
labels = ['Very Low', 'Low', 'Medium', 'High', 'Very High']

df['Rank Classifier'] = pd.cut(df['Percentile Rank'], bins=bins, labels=labels)

ПРИМЕЧАНИЕ, как я уже сказал, приведено выше желаемый выход, который вы указали в этом вопросе.

Тем не менее, я не уверен, что желаемый вывод является правильным.

Например, не следует Hume классифицировать как Low, а не Very Low.

Кроме того, как можно Point Cook иметь Percentile Rank 1,505447257?

Я думаю, вам нужно проверить свои критерии.

Снимание Список BINS действительно должен начинаться с 0, и последнее значение должно быть 1.

bins = [0, 0.2, 0.4, 0.6, 0.8, 1]
6
norie 3 Июн 2021 в 03:57

Попробуйте использовать Apply

def RankClassifier(perc_rank):
    if (perc_rank  <= 0.2):
        return "Very Low"
    elif (perc_rank > 2) & (perc_rank <= 0.4):
        return "Low"
    elif (perc_rank > 0.4) & (perc_rank  <= 0.6):
        return "Medium"
    elif (perc_rank  > 0.6) & (perc_rank <= 0.8):
        return "High"
    elif (perc_rank > 8) & (perc_rank <=1 ):
        return "Very High"       
    else:
        return RankClassifier
    
df['Rank Classifier']= df['Percentile Rank'].apply(Classifier)

0
Francisco Puga 3 Июн 2021 в 07:39