如何高效从旧DataFrame生成新DataFrame?替代iterrows/itertuples方案
高效生成学生在校年份记录的Pandas解决方案
针对你处理200万条学生数据时,拆分在校年份行效率极低的问题,以下是两种远快于循环的解决方案:
方案一:Pandas apply + explode(简洁高效)
利用apply为每个学生生成在校年份的序列,再通过explode将序列拆分为单独行,彻底避免手动循环:
import pandas as pd # 假设原始数据集为df,包含COD、YEAR_INCLUSION、YEAR_END列 # 为每行生成在校年份的列表 df['YEAR'] = df.apply(lambda row: list(range(row['YEAR_INCLUSION'], row['YEAR_END'] + 1)), axis=1) # 拆分列表为单独行,保留目标列 result_df = df[['COD', 'YEAR']].explode('YEAR').reset_index(drop=True)
方案二:Numpy矢量化操作(超大数据集最优)
对于200万行的规模,Numpy的底层C实现能进一步提升效率,完全规避Python层面的逐行操作:
import pandas as pd import numpy as np # 计算每个学生的在校年数 n_years = df['YEAR_END'] - df['YEAR_INCLUSION'] + 1 # 按在校年数重复学生编码 cod_repeated = np.repeat(df['COD'].values, n_years.values) # 生成所有在校年份的连续序列 year_ranges = [np.arange(start, end + 1) for start, end in zip(df['YEAR_INCLUSION'], df['YEAR_END'])] all_years = np.concatenate(year_ranges) # 构建最终结果DataFrame result_df = pd.DataFrame({'COD': cod_repeated, 'YEAR': all_years})
关键优化说明
- 彻底抛弃
iterrows/itertuples:这类方法逐行遍历Python对象,在大数据集下效率比矢量化操作低数百倍 - 优先用批量操作:Pandas/Numpy的底层实现基于C,处理批量数据的速度远超Python循环
- 提前清理异常数据:如果存在
YEAR_INCLUSION > YEAR_END的无效行,先通过df = df[df['YEAR_INCLUSION'] <= df['YEAR_END']]过滤,避免生成空序列拖慢效率
内容的提问来源于stack exchange,提问作者Leonardo Nascimento
相关产品推荐
相关产品推荐

