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

如何向量化优化拼接相同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:15:02