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

Pandas如何向量化实现按count列值复制DataFrame行提升运行效率

问题背景

现有包含Count列的DataFrame,需要按Count列的数值复制对应行数。原有逐行遍历+append的实现在处理大型数据集时运行速度极慢,原有代码如下:

def replicate_row(df):
    for i in range(len(df)):
        row = df.iloc[i]
        if row['count']>0:
           rep = int(row['count'])-1
           if rep != 0:
               full_df = full_df.append([row]*rep, ignore_index=True)

需要将逻辑改写为向量化实现提升运行速度,已给出的函数框架如下,需补全向量化复制行的核心逻辑:

def vector_function(
    pandas_series: pd.Series) -> pd.Series:
    scaled_series = pandas_series['count'] - 1
    *** vectorized replication code here ? ***
    return scaled_series
示例输入
Name    Age    Gender    Count
Jen     25     F         3
Paul    30     M         2
期望输出

移除Count列,每行按Count值重复对应次数,效果如下:

Name    Age    Gender    
Jen     25     F         
Jen     25     F         
Jen     25     F         
Paul    30     M         
Paul    30     M         
向量化实现方案

原循环写法性能差的核心原因是:逐行遍历是Python层的循环,且每次调用append都会触发全量DataFrame的内存拷贝,数据量越大性能衰减越明显。
pandas原生支持基于索引重复的向量化行复制,不需要逐行操作,百万行级数据也可秒级返回结果,核心逻辑是用index.repeat()生成对应重复次数的索引,直接通过索引取数即可。

核心实现代码

import pandas as pd
import numpy as np

def replicate_rows_vectorized(df: pd.DataFrame) -> pd.DataFrame:
    # 过滤Count值小于等于0的无效行
    valid_df = df[df['Count'] > 0].copy()
    # 按Count值重复对应行索引,取数后删除Count列、重置索引
    result = valid_df.loc[valid_df.index.repeat(valid_df['Count'])]\
        .drop(columns=['Count'])\
        .reset_index(drop=True)
    return result

效果验证

用示例数据调用上述函数,输出结果和期望完全一致:

Name  Age Gender
0   Jen   25      F
1   Jen   25      F
2   Jen   25      F
3  Paul   30      M
4  Paul   30      M

性能说明

  • 该实现全程走pandas底层的C级向量化运算,没有Python层逐行循环开销
  • 避免了反复append触发的多次内存拷贝,性能比原循环实现高2~3个数量级
  • 注意:绝对不要在循环中频繁调用DataFrame.append(),该方法本身就会在每次调用时复制全量数据,是pandas常见性能坑之一

内容的提问来源于stack exchange,提问作者KL_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.09 16:15:42