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

Pandas apply方法性能优化:多条件列值转换场景

优化Pandas逐行数据转换的性能问题

首先,你的问题核心在于用apply逐行处理数据——这在Pandas里是出了名的慢,因为它本质上是在Python层面做循环,完全没利用到Pandas底层的向量化优化能力。针对你的实际场景,我们可以用**向量化字符串处理+合并(merge)**的方案彻底解决性能问题,46K条数据应该能在几秒内完成处理。

第一步:批量清洗parent_df的location列

你的parent_df里location格式是_pre_XXX_post,需要提取中间的城市名。别用逐行split,直接用Pandas的向量化字符串方法批量处理:

# 用正则提取_pre_和_post之间的城市名,一步完成所有行的清洗
parent_df['clean_location'] = parent_df['location'].str.extract(r'_pre_(.*)_post')

这个方法比apply里的split快几十倍,因为它是底层C语言实现的批量操作,避开了Python循环的开销。

第二步:用merge替代逐行匹配筛选

接下来,我们不需要逐行去location_df里筛选匹配,而是把location_df当成一个映射表,用merge做左连接,同时匹配clean_location和type两个字段:

# 先重命名location_df的school列,避免合并后列名冲突
mapping_df = location_df.rename(columns={'school': 'new_school'})

# 左连接:同时匹配城市名和type两个条件
merged_df = parent_df.merge(
    mapping_df,
    left_on=['clean_location', 'type'],
    right_on=['location', 'type'],
    how='left'
)

# 处理匹配结果:有匹配到就用new_school,没匹配到就保留原school
parent_df['school'] = merged_df['new_school'].fillna(merged_df['school'])

# 不需要临时列的话可以删除
parent_df.drop('clean_location', axis=1, inplace=True)

为什么这个方案性能提升这么大?

  • 向量化操作:字符串提取和merge都是Pandas的底层优化功能,用C语言实现,完全避开了Python循环的低效问题。
  • 哈希表批量匹配:merge是基于哈希表的批量匹配逻辑,比逐行遍历查找的效率高几个数量级。

额外优化小技巧

如果location_df的数据量很大,可以先给它的location和type列建立复合索引,进一步提升merge的速度:

location_df.set_index(['location', 'type'], inplace=True)
# 后续merge时可以直接基于索引匹配,效率会更高

效果对比

原来的apply逐行处理46K条数据需要2分钟,用这个方案应该能压缩到10秒以内(具体时间取决于机器配置,但肯定是数量级的性能提升)。

内容的提问来源于stack exchange,提问作者Mitaksh Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:17:56