如何高效为大型DataFrame新增列?现有方法效率低下求优化
问题描述
我有两个DataFrame:约9000行的adv_text,以及超900000行的events(events是adv_text的扩展版本,每行adv_text对应约100行events)。我希望将adv_text中的三列添加到events中。
我尝试了以下仅添加单列的测试代码:
events_x = events.head(30000).copy() def add_date(game_id): date = adv_text[adv_text['id_odsp'] == game_id]['date'] return(date.iloc[0]) events_x['date'] = events_x['id_odsp'].apply(add_date)
该测试代码处理30000行耗时近25秒,按此速度处理全量数据并添加三列需近40分钟。请问这一耗时是否正常?有无更高效的实现方法?
解决方案
耗时是否正常?
这种耗时完全不正常,你的实现效率极低。核心问题是apply的逐行遍历逻辑:每处理一个id_odsp就对adv_text做一次全表筛选,相当于30000次全表查询,自然慢得离谱。
高效实现:用pandas的merge方法
直接用merge是这类一对多关联场景的最优解,pandas底层对这个操作做了大量向量化优化,速度能提升几个数量级。
代码示例:
import pandas as pd # 先提取adv_text里需要的列:关联键id_odsp + 要添加的三列 adv_text_needed = adv_text[['id_odsp', 'date', '列名1', '列名2']] # 替换成你实际要添加的三列名称 # 以id_odsp为关联键,把adv_text的列合并到events中 events_merged = pd.merge(events, adv_text_needed, on='id_odsp', how='left')
how='left':保留events的所有行,即使adv_text中没有匹配的id_odsp(对应值会是NaN)。如果你的数据是严格的一对多(每个events的id_odsp都存在于adv_text),用how='inner'也可以,结果一致。- 这种方式不需要循环或
apply,底层基于哈希表做关联,处理90万行数据通常只需要几秒到十几秒。
额外优化点
如果两个DataFrame的id_odsp数据类型不一致(比如一个是字符串、一个是整数),先统一类型再合并,能避免不必要的性能损耗:
adv_text['id_odsp'] = adv_text['id_odsp'].astype(str) events['id_odsp'] = events['id_odsp'].astype(str)
内容的提问来源于stack exchange,提问作者Cuenca Guy
相关产品推荐
相关产品推荐

