pandas基于另一DataFrame匹配结果新增列,现有实现如何优化
现有实现的效率问题
你目前的实现不是最高效的,主要存在两个性能缺陷:
- 逐行
apply是Python级别的循环,无法利用pandas底层的向量化优化,数据量过万后性能会急剧下降 - 每次循环都要把
data2["KEY"]转为列表再做in判断,列表的成员查询时间复杂度为O(n),且重复生成列表会带来额外开销,data2数据量越大性能损耗越明显
更优实现方案
推荐使用pandas自带的向量化判断操作,性能可以提升几十到上百倍(随数据量增大优势更明显):
import pandas as pd d1 = {"KEY": ["KEY1", "KEY2", "KEY3"], "value1": ["ABC",[] , []], "value2": ["abc", "XYZ",[] ]} data1 = pd.DataFrame(d1) d2 = {"KEY": ["KEY2"]} data2 = pd.DataFrame(d2) # 提前将data2的KEY转为集合,实现O(1)时间复杂度的成员查询 d2_key_set = set(data2["KEY"]) # 向量化赋值:符合条件取value2,否则取value1 data1["value"] = data1["value2"].where(data1["KEY"].isin(d2_key_set), data1["value1"])
如果更习惯np.where的写法也可以替换,效果完全一致:
import numpy as np data1["value"] = np.where(data1["KEY"].isin(d2_key_set), data1["value2"], data1["value1"])
内容的提问来源于stack exchange,提问作者Mr.Hedge
相关产品推荐
相关产品推荐

