Поскольку я обрабатываю все больше и больше данных, функция применения, которую я использую, теперь замедляет мои проекты. Я очень часто использую векторизацию в своей работе, но для какой-то функции я попробовал безуспешно (пока).
Вопрос:
Как векторизовать эту функцию, содержащую множественное решение?
Здесь вы найдете неоптимизированный пример кода (с использованием apply):
df = pd.DataFrame(np.random.randint(0,1000,size=(100000, 4)), columns=list('ABCD'))
def what_should_eat_that_cat(row):
start_ = row[0]<=500
end_ = row[1] <=500
miaw = row[2]<=200
if start_ & end_:
if miaw:
return 'cat1'
else:
return 'cat2'
if start_ & ~end_:
return 'cat3'
if ~start_ & end_:
return 'cat4'
else :
return 'cat5'
start_time = time.time()
df.loc[:,'eat_cat'] = df.loc[:,['A','B','C']].apply(what_should_eat_that_cat,axis=1)
print("--- %s seconds ---" % (time.time() - start_time))
Это займет 16 секунд, чтобы обработать 100 тыс. Строк.
Результат должен выглядеть примерно так:
df.eat_cat =>
0 cat5
1 кат5
2 кат3
3 кат5
4 кат4
Вот мой прогресс на данный момент.
def what_should_eat_that_cat(A,B,C):
start_ = A <=500
end_ = B <=500
miaw = C <=200
if start_ & end_:
if miaw:
return 'cat1'
else:
return 'cat2'
if start_ & ~end_:
return 'cat3'
if ~start_ & end_:
return 'cat4'
else :
return 'cat5'
df.loc[:,'eat_cat'] = what_should_eat_that_cat(df.A, df.B, df.C)
Я получаю эту ошибку: Значение истинности Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().
Я понимаю почему. Но я все равно не понимаю, как векторизовать.
Вот некоторая документация по векторизации:
https://engineering.upside.com/a-beginners-guide-to-optimizing-pandas-code-for-speed-c09ef2c6a4d6
Согласно этому веб-сайту, эта операция может выполняться в 50 раз быстрее.