为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

aluckdog 2022-06-07 19:27:14
我正在我的 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))谁能解释为什么第二个会导致如此巨大的改进?为什么 Pandas .isin() 方法比“==”更快的答案并没有真正解释它。
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

两种方法之间的差异主要是由x in X操作的性能引起的。O(size_of_X)当 X 是一个列表并且O(1)X 是一个集合时,这个测试是复杂的。


如果您将 lst 转换为setbefore 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


查看完整回答
反对 回复 2022-06-07
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信