我想知道为什么
df['new_col'] = (df['old_col'] == 'string').astype(int)
815 µs ± 6.63 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
比慢
df['new_col'] = df['old_col'].isin(['string']).astype(int)
334 µs ± 5.33 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
最佳答案
您的测试不具有代表性。使用更大的数据框:
import pandas as pd, numpy as np
df = pd.DataFrame(np.random.randint(0, 9, 100000))
%timeit df[0].isin([1]) # 12.8ms
%timeit df[0] == 1 # 285µs
对于较小的数据帧,例如
nrows=10
,我看到isin
时间的警告:“最慢的运行时间比最快的运行时间长4.21倍。这可能意味着正在缓存中间结果。”我不会担心微秒。如果您发现较大的数据框在性能上存在显着差异,那么可能值得研究。
正如一个聪明人曾经说过的,过早的优化是万恶之源。
更新资料
pandas
算法确实存在一些问题,在与numpy数组等效的列表理解中这并不明显:df = pd.DataFrame({'old_col':['string', 'new']})
df = pd.concat([df] * 10000, ignore_index=True)
arr = df.values
%timeit [i in ['string'] for i in arr] # 106ms
%timeit [i == 'string' for i in arr] # 106ms
%timeit df['old_col'].isin(['string']) # 1.25ms
%timeit df['old_col'] == 'string' # 2.88ms
isin
版本使用numpy.in1d
,这相当有效。关于python - 为什么Pandas .isin()方法比“==”要快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49275330/