【发布时间】:2020-01-26 00:28:30
【问题描述】:
我正在我的 DataFrame 中创建一个指示列来表示不同列的值是否在列表中。
我的第一次尝试使用了基本的 python“in”运算符,我的进度条显示它需要 83 小时才能运行。然后我尝试使用熊猫“.isin()”,不到一秒钟。我的 DataFrame 有大约 40,000,000 行,我正在搜索的列表有大约 100,000 个项目。该列表已被过滤以删除重复项 (lst=list(set(original_list)))。我比较的项目是大约 20 个字符的字符串。
这是我的第一次尝试(需要 83 小时):
df['indicator']=df['col1'].progress_apply(lambda x: 1 if x in lst else 0)
这是我的第二次尝试(不到一秒):
df['indicator']=df['col1'].isin(tqdm(lst))
谁能解释为什么第二个会导致如此巨大的进步? Why is Pandas .isin() method faster than "=="的答案并没有真正解释。
【问题讨论】:
-
你的问题应该是
Why *isin* faster than *apply(lambda x: x in lst)*,一个是矢量化的,另一个不是。 -
然后
in使用Series.apply,这是一个循环,但开销更大。Series.isin使用了一些复杂的重塑更快的方法。 -
时间复杂度方面,因为
.apply大致是一个for循环,所以您的第一行代码具有O(N*M)复杂性,而您的第二行具有O(max(N, M))(或O(N+M)) 复杂性,这是一个很大的区别。