Pandas 데이터 프레임을 사용하고 있으며 기존 열의 함수로 새 열을 만들고 싶습니다. 나는 속도 차이에 대한 좋은 토론을 보지 못했습니다.df.apply()
과 np.vectorize()
내가 여기 물어 것이라고 생각 때문에.
Pandas apply()
기능이 느립니다. 내가 측정 한 것 (일부 실험에서 아래에 표시됨)에서 np.vectorize()
사용하면 apply()
적어도 2016 MacBook Pro에서 DataFrame 기능을 사용하는 것보다 25 배 더 빠릅니다 (또는 그 이상) . 이것은 예상 된 결과이며 그 이유는 무엇입니까?
예를 들어 N
행 이있는 다음 데이터 프레임이 있다고 가정 합니다.
N = 10
A_list = np.random.randint(1, 100, N)
B_list = np.random.randint(1, 100, N)
df = pd.DataFrame({'A': A_list, 'B': B_list})
df.head()
# A B
# 0 78 50
# 1 23 91
# 2 55 62
# 3 82 64
# 4 99 80
추가로 두 개의 열 A
및 의 함수로 새 열을 생성한다고 가정 B
합니다. 아래 예에서는 간단한 함수를 사용합니다 divide()
. 기능을 적용하려면 df.apply()
또는 np.vectorize()
다음 중 하나를 사용할 수 있습니다 .
def divide(a, b):
if b == 0:
return 0.0
return float(a)/b
df['result'] = df.apply(lambda row: divide(row['A'], row['B']), axis=1)
df['result2'] = np.vectorize(divide)(df['A'], df['B'])
df.head()
# A B result result2
# 0 78 50 1.560000 1.560000
# 1 23 91 0.252747 0.252747
# 2 55 62 0.887097 0.887097
# 3 82 64 1.281250 1.281250
# 4 99 80 1.237500 1.237500
내가 늘리면 N
100 만 이상의처럼 실제 크기에, 나는 그 관찰 np.vectorize()
25 배 빠른 이상보다 df.apply()
.
다음은 완전한 벤치마킹 코드입니다.
import pandas as pd
import numpy as np
import time
def divide(a, b):
if b == 0:
return 0.0
return float(a)/b
for N in [1000, 10000, 100000, 1000000, 10000000]:
print ''
A_list = np.random.randint(1, 100, N)
B_list = np.random.randint(1, 100, N)
df = pd.DataFrame({'A': A_list, 'B': B_list})
start_epoch_sec = int(time.time())
df['result'] = df.apply(lambda row: divide(row['A'], row['B']), axis=1)
end_epoch_sec = int(time.time())
result_apply = end_epoch_sec - start_epoch_sec
start_epoch_sec = int(time.time())
df['result2'] = np.vectorize(divide)(df['A'], df['B'])
end_epoch_sec = int(time.time())
result_vectorize = end_epoch_sec - start_epoch_sec
print 'N=%d, df.apply: %d sec, np.vectorize: %d sec' % \
(N, result_apply, result_vectorize)
# Make sure results from df.apply and np.vectorize match.
assert(df['result'].equals(df['result2']))
결과는 다음과 같습니다.
N=1000, df.apply: 0 sec, np.vectorize: 0 sec
N=10000, df.apply: 1 sec, np.vectorize: 0 sec
N=100000, df.apply: 2 sec, np.vectorize: 0 sec
N=1000000, df.apply: 24 sec, np.vectorize: 1 sec
N=10000000, df.apply: 262 sec, np.vectorize: 4 sec
경우는 np.vectorize()
항상 속도보다 일반적이다 df.apply()
, 왜되어 np.vectorize()
더 언급하지? 다음 df.apply()
과 같은 관련 StackOverflow 게시물 만 볼 수 있습니다.
np.vectorize
for
apply