为什么熊猫.isin比“ in”快得多?

时间:2019-09-25 18:42:13

标签: python pandas

我正在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 "=="的答案并没有真正解释它。

1 个答案:

答案 0 :(得分:1)

两种方法之间的差异主要是由x in X操作的执行引起的。如果X是列表,则测试的复杂度为O(size_of_X),如果X是集合,则此测试的复杂度为O(1)

如果在set之前将lst转换为progress_apply,则可以获得与Series.isin相同的性能

这是一个快速基准测试

SERIES = pd.Series([str(i) for i in range(100000)])
LIST = [str(i) for i in range(-10000, 10000)]

%timeit SERIES.isin(LIST)
# 9.2 ms

SERIES.map(lambda x: x in LIST)
# 22000 ms

%timeit SET = set(LIST); SERIES.map(lambda x: x in SET)
# 24.8 ms