You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效为大型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:07:24