如何向量化优化拼接相同ID重复行Year字段的Pandas函数
Pandas 迭代遍历优化方案
你的原有实现采用iterrows逐行遍历,所有逻辑都在Python层执行,数据量较大时性能瓶颈非常明显,完全可以通过pandas原生向量化分组操作改造,性能可以提升几十至上百倍。
核心改造思路
- 抛弃Python层的逐行循环逻辑,改用pandas内置的
groupby分组聚合实现,所有计算都在C层执行,效率远高于自定义循环 - 拆分原有逻辑为两个独立的分组计算步骤:先按ID分组拼接升序Year前缀,再按ID分组拼接符合条件的Period后缀,最后合并两部分内容
优化后代码
import pandas as pd def create_concat_col(df): # 拷贝避免修改原始DataFrame df = df.copy() # 提前转换字段类型,避免拼接报错 df['Year'] = df['Year'].astype(str) df['Period'] = df['Period'].astype(str) # 1. 按ID分组,将组内Year升序排列后用x拼接为前缀 # 如果需要保留重复Year直接用下方代码,要去重的话在sort_values后加.drop_duplicates(['ID', 'Year']) year_prefix = df.sort_values('Year', ascending=True).groupby('ID')['Year'].agg('x'.join) # 2. 按ID分组,拼接所有Duplicate为False的Period值 period_suffix = df[~df['Duplicate']].groupby('ID')['Period'].agg('_'.join) # 3. 合并前缀和后缀,无符合条件的Period时不加下划线 concat_map = year_prefix.str.cat(period_suffix, sep='_', na_rep='') # 4. 插入到原表第12列位置 df.insert(12, 'Concat', df['ID'].map(concat_map)) return df
注意事项
- 如果原有逻辑要求Year按降序拼接,把
sort_values的ascending参数改为False即可 - 如果同ID下存在多条
Duplicate=False的行,代码会按原表行顺序拼接所有对应的Period值,和原有逻辑一致 - 若不需要保留同ID下重复的Year,在
sort_values后补充drop_duplicates(['ID', 'Year'])即可
内容的提问来源于stack exchange,提问作者Jan Valušek
相关产品推荐
相关产品推荐

