如何优化Pandas从多DataFrame构建数组新列的大数据量处理代码
原代码的核心问题在于逐活动循环合并,每处理一个活动就给Leads表新增一列,当活动数量较多时会导致DataFrame列数爆炸,且iterrows迭代、多次merge操作都会大幅提升内存占用和计算耗时,完全不适合大数据量场景。
优化方案
仅通过两次关联+一次分组聚合即可完成需求,全程使用pandas原生向量化操作,内存占用低、执行效率高,逻辑如下:
- 先关联Campaigns和Campaign Members表,拿到每个LeadId对应的活动名称
- 按LeadId分组,将同一用户的所有活动名称聚合为列表
- 将聚合结果左关联到Leads表,未匹配到活动的用户填充为空列表
实现代码:
import pandas as pd # 关联活动表和活动成员表,拿到每个线索对应的活动名 lead_campaign_rel = campaign_members.merge( campaigns[["Id", "Name"]], left_on="CampaignId", right_on="Id", how="left" )[["LeadId", "Name"]] # 按线索ID分组,聚合活动名称为列表 lead_campaign_agg = lead_campaign_rel.groupby("LeadId")["Name"].agg(list).reset_index() # 左关联到线索表 leads_df = leads_df.merge( lead_campaign_agg, left_on="Id", right_on="LeadId", how="left" ).drop(columns="LeadId").rename(columns={"Name": "Campaigns"}) # 未参加任何活动的线索填充为空列表 leads_df["Campaigns"] = leads_df["Campaigns"].apply(lambda x: x if isinstance(x, list) else [])
性能优势
优化后的代码无需循环遍历活动,也不会生成大量冗余的中间列,内存占用仅和原始3张表的总数据量正相关,哪怕是百万级的线索、活动、成员数据也可以正常执行。如果数据量特别大,还可以直接将pandas替换为dask等并行计算框架,逻辑完全兼容无需修改。
内容的提问来源于stack exchange,提问作者Hassan Syyid
相关产品推荐
相关产品推荐

