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

如何高效从旧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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:45:35