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_
相关产品推荐
相关产品推荐

