Как векторизовать, если условие с рядом панд? - PullRequest
1 голос
/ 09 апреля 2019

Я хочу избежать применения apply () и вместо этого векторизовать мою обработку данных.

У меня есть функция, которая формирует данные на основе нескольких условий "if" и "else".Как передать данные в эту функцию?

def my_function(id):
    if 0 <= id <= 30000:
       cal_score = 5
    else:
       cal_score = 0

    return cal_score     

Apply () работает, он проходит по каждой строке

Но apply () работает медленно для огромного набора данных.(Мой сценарий)

df['final_score'] = df.apply(lambda x : my_function(x['id']), axis = 1)

Передача массива numpy не работает !!

df['final_score'] = my_function(df['id'].values)

ОШИБКА: "значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.call ()

Не нравится, когда весь массив проходит как цикл "if" в моих ошибках функций из-за более чем 1 элемента

Я хочу обновитьмой столбец final_score, основанный на значениях идентификаторов, но с передачей всего массива.

как мне спроектировать или решить это?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Используйте Series.between для создания вашего условия, умножьте полученную маску на 5.

df['final_score'] = df['id'].between(0, 30000, inclusive=True) * 5
0 голосов
/ 09 апреля 2019

Это просто:

  1. Преобразование серии в массив numpy через '.values'

    n_a = df ['final_score']. Значения

  2. Векторизация вашей функции

    vfunc = np.vectorize (my_function)

  3. Рассчитать массив результатов, используя векторизованную функцию:

    res_array = vfunc (n_a)

    df ['final_score'] = res_array

Проверьте https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.vectorize.html для более подробной информации

Векторизованные вычисления по pd. Серии, преобразованные в массив numpy, могут быть в 10 раз быстрее, чем при использовании внутренних вычислений панд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...