Функция (?) Для применения к pd.Series - PullRequest
0 голосов
/ 30 января 2020

Текущая ситуация. Я не знаю, правильна ли моя функция и как «применить» к pd.Series.

Функция:

def levels(row):
if row.between(0,3):
    return "basic"
elif row.between(3.01, 8.5):
    return "intermediate"
else:
    return "advanced"

Моя серия: test_result ["Points"] выглядит:

    1            3.0
Book1            0.0
Maja             1.0
Michal.Faron     0.0
Solutions       10.0
Name: Points, dtype: float64

Я пытался:

test_result['LEVEL']=test_result["Points"].apply(levels)

Я хочу в конце дополнительный столбец: УРОВЕНЬ со строками на основе критериев в рамках моей функции

Ответы [ 2 ]

4 голосов
/ 30 января 2020

Это будет довольно медленно, если применить к большому набору данных. Рекомендую использовать маску или loc;

df['level'] = 'advanced'
df.loc[3.01 <= df.points < 8.5, 'level'] = 'intermediate'
df.loc[0 <= df.points < 3.01, 'level'] = 'basic'

Должно быть намного быстрее.

РЕДАКТИРОВАТЬ

О, я думал, что это сработает, но это не так. Используйте это вместо;

df.loc[(df.points >= 3.01) & (df.points < 8.5), 'level'] = 'intermediate'
df.loc[(df.points >= 0) & (df.points < 3.01), 'level'] = 'basic'
0 голосов
/ 30 января 2020

Проблема в том, что row - это число с плавающей точкой, а у чисел с плавающей точкой нет метода between. Если вы действительно хотите использовать его, вы можете преобразовать его обратно в серию pandas:

def levels(row):
    if pd.Series([row]).between(0,3)[0]:
        return "basic"
    elif pd.Series([row]).between(3.01, 8.5)[0]:
        return "intermediate"
    else:
        return "advanced"
...