Pandas基于条件创建字典列:跨DataFrame按id匹配生成新列
Pandas逐行生成字典列的高效实现
前置优化:构建O(1)查找映射
先对df_1做一次单向遍历,将id作为键、对应行的rank_dict作为值存入内存字典,避免后续逐行匹配时重复全表扫描df_1,把查找效率从线性复杂度降为常数级:
# 生成id与原始rank字典的映射关系 id_rank_lookup = dict(zip(df_1["id"], df_1["rank_dict"]))
逐行生成new_rank_dict列
编写适配Pandas行操作的处理函数,严格匹配业务规则:
def build_row_rank_dict(row): # 获取当前行id对应的df_1源字典,无匹配项时返回空字典避免报错 source_rank_dict = id_rank_lookup.get(row["id"], {}) # 以三个rank列的URL为键,存在则取源字典值,不存在赋值为0 return { row["rank_1"]: source_rank_dict.get(row["rank_1"], 0), row["rank_2"]: source_rank_dict.get(row["rank_2"], 0), row["rank_3"]: source_rank_dict.get(row["rank_3"], 0) } # 应用函数生成目标新列 df_2["new_rank_dict"] = df_2.apply(build_row_rank_dict, axis=1)
结果校验
代码运行完成后输出的df_2与预期结构完全一致:
- id为2223的行生成字典为
{www.yahoo.com:2, www.whatever.com:0, www.google.com:3} - id为1112的行生成字典为
{www.gm.com:0, www.motor1.com:2, www.webull.com:1}
性能说明
常规数据规模(万行级)下,上述写法的运行效率完全满足需求,且逻辑清晰易维护。如果是百万行以上的超大体量数据集,可以将逐行apply替换为向量化匹配逻辑进一步压缩运行时间。
内容的提问来源于stack exchange,提问作者Stanleyrr
相关产品推荐
相关产品推荐

