Панды применяют конвертирование в int различия между np.int, lambda и astype () - PullRequest
0 голосов
/ 21 октября 2018

Учитывая df

df = pd.DataFrame(['0', '1', '2', '3'], columns=['a'])

В чем разница между использованием

 df['b'] = df['a'].apply(np.int)

,

df['b'] = df['a'].apply(lambda x : int(x))

и

df['b'] = df['a'].astype(int)

?

Я знаю, что все дадут одинаковый результат, но есть ли различия?

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

В приведенной ниже функции pandas apply итеративно используется приведение int от numpy, такое же как и для int в python.Итак, оба они, увы, одинаковы.

df['b'] = df['a'].apply(np.int)
df['b'] = df['a'].apply(lambda x : int(x))

Функция astype, однако, приводит серию к указанному dtype, здесь int , который для панд равен int64 .

df['b'] = df['a'].astype(int)

astype - это векторизованная функция, и я бы предпочел использовать ее, а не apply метод из-за ее низкой сложности по сравнению с astype .

0 голосов
/ 21 октября 2018

Когда вы используете apply, он работает, зацикливая данные и изменяя dtype каждого значения на целое число.Таким образом, они медленнее по сравнению с astype

df = pd.DataFrame(pd.np.arange(10**7).reshape(10**4, 10**3)).astype(str)

# Performance
%timeit df[0].apply(np.int)
7.15 ms ± 319 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df[0].apply(lambda x : int(x))
9.57 ms ± 405 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Оба схожи по производительности.

Здесь astype, которая оптимизирована для работы быстрее, чем применяется.

%timeit df[0].astype(int)
1.94 ms ± 96.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

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

%timeit df[0].values.astype(np.int)
1.26 ms ± 19.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Как видите, разница во времени огромна.

0 голосов
/ 21 октября 2018

np.int - псевдоним для int.

Вы можете проверить это, запустив:

import numpy as np
print(int == np.int)

, которая вернет True.

Также: рассмотрите вопрос этого вопроса , который содержит очень подробное объяснение вашего вопроса.

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