高效实现Pandas按列指定次数重复行的方法(替代循环)
高效重复DataFrame行的解决方案
你当前基于iterrows循环+concat的方案在大数据集下性能极差,核心问题是Python层面的逐行循环和频繁的DataFrame拼接会带来巨大的时间与内存开销。pandas提供了原生的矢量化操作方案,完全不需要循环或apply,能极大提升处理效率。
最优解决方案(矢量化操作)
直接利用df.index.repeat()生成重复的索引,再通过loc索引器一次性获取所有重复行:
import pandas as pd df = pd.DataFrame(data={'col1': list('abc'), 'col2': [2, 2, 3]}) # 核心代码:一次性完成所有行的重复 df_repeated = df.loc[df.index.repeat(df['col2'])] # 可选:重置索引(如果需要连续的整数索引) df_repeated = df_repeated.reset_index(drop=True)
运行结果:
| col1 | col2 |
|---|---|
| a | 2 |
| a | 2 |
| b | 2 |
| b | 2 |
| c | 3 |
| c | 3 |
| c | 3 |
为什么这个方法高效?
这是pandas的矢量化操作,所有重复逻辑在底层C语言实现,完全避免了Python层面的循环开销,处理十万甚至百万级数据时,速度比逐行循环快100倍以上。
关于你尝试的apply方法(不推荐)
如果一定要用apply,正确的写法如下,但注意该方法效率远低于上面的矢量化方案,仅适合小数据集:
# apply的正确写法(不推荐用于大数据集) df_apply = df.apply(lambda row: pd.DataFrame([row.values]*row['col2'], columns=df.columns), axis=1) df_apply = pd.concat(df_apply.tolist()).reset_index(drop=True)
apply本质还是逐行遍历,和iterrows循环的效率差异不大,只是写法更简洁,大数据集下仍会出现性能瓶颈。
内容的提问来源于stack exchange,提问作者CryptTP
相关产品推荐
相关产品推荐

