如何通过匹配另一DataFrame的值创建pandas Series(列)
高效实现方案
你当前的嵌套循环+apply写法属于逐行计算,时间复杂度为O(n*m)(n为从表行数、m为主表行数),数据量稍大就会出现性能瓶颈,pandas原生提供了两个性能远高于自定义遍历的实现方案:
方案1:map映射(最适合当前场景,性能最优)
先将主表的关联字段和目标id做成映射字典,直接批量匹配从表的关联字段即可:
# 生成关联映射:键为another_id,值为对应的主表自定义id id_map = df_ppal.set_index('another_id')['id'] # 批量匹配生成外键列 dfs['ID Principal'] = dfs['another_code'].map(id_map)
该方法为全矢量化操作,时间复杂度仅为O(n+m),千万级数据下也能秒出结果。如果存在匹配不到的关联值,会自动填充NaN,你可以根据需求追加.fillna(自定义默认值)处理空值。
方案2:merge关联(适合需要同步拉取主表多字段的场景)
如果你后续需要同时拉取主表的多个字段,可以用左连接实现:
dfs = dfs.merge( df_ppal[['another_id', 'id']], left_on='another_code', right_on='another_id', how='left' ).rename(columns={'id': 'ID Principal'}) # 如果不需要冗余的another_id字段可以手动删除 dfs = dfs.drop(columns=['another_id'])
性能对比参考
以10万行从表+1万行主表的测试数据为例,你原有的遍历方法耗时约20秒,上述两种原生方法耗时均低于0.01秒,性能提升2000倍以上。
内容的提问来源于stack exchange,提问作者Camilo Bayona
相关产品推荐
相关产品推荐

