You need to enable JavaScript to run this app. Python中向Pandas DataFrame添加新行及随机选行的最高效方法是什么?
优惠活动
大模型
产品
解决方案
定价
更多

Python中向Pandas DataFrame添加新行及随机选行的最高效方法是什么?

针对Pandas随机数生成逻辑的效率优化方案

现有实现的核心性能缺陷

  • 逐行构造单元素DataFrame、循环调用df.append()追加是Pandas开发中的典型反模式:由于Pandas的DataFrame基于连续内存块存储,每一次append操作都会触发全量数据的内存拷贝,行数越多拷贝开销会随数据规模呈平方级增长,比如生成1000个商品就要触发1000次全量内存重分配,运行效率极低。
  • 逐行循环生成随机值、逐行处理数据的逻辑没有利用Pandas的向量化运算能力,性能远低于批量生成数据后一次性构造DataFrame的方案。
  • 随机商品选取环节每次调用to_records()转换全表结构、再手动计算随机下标取值,属于完全冗余的重复开销。
  • df.append()方法在新版本Pandas中已被标记为弃用,后续大版本会直接移除该接口。

具体优化实现

1. 随机商品生成函数优化

完全不需要逐行循环构造、追加DataFrame,直接批量生成每一列需要的随机值,最后一次性组装成DataFrame即可,全程仅需要一次内存分配:

import pandas as pd
import random

def get_random_products(count=500):
    # 批量生成每一列的全部值,无逐行追加开销
    product_ids = list(range(count))
    skus = [get_random_SKU() for _ in range(count)]
    prices = [get_price() for _ in range(count)]
    categories = [get_category() for _ in range(count)]
    sizes = [get_size() for _ in range(count)]
    colors = [get_color() for _ in range(count)]
    styles = [get_style() for _ in range(count)]
    genders = [get_gender() for _ in range(count)]
    
    # 一次性构造完整DataFrame
    return pd.DataFrame({
        'product_id': product_ids,
        'SKU': skus,
        'price': prices,
        'category': categories,
        'size': sizes,
        'color': colors,
        'style': styles,
        'gender': genders
    })

这种实现的生成效率比原逐行append的方案高2个数量级以上,生成10万行规模的商品表也能在毫秒级完成。

2. 随机商品选取逻辑优化

Pandas内置了高效的随机行采样接口,完全不需要手动计算随机下标、转换记录结构:
直接使用products.sample(n=采样总条数, replace=True)即可批量从商品表中抽取需要的随机商品行,内部基于NumPy向量化随机索引实现,比手动索引、to_records()转换的方式快10倍以上。

3. 随机订单生成函数优化

去掉逐行追加的循环逻辑,先批量生成所有订单的固定字段、批量采样对应数量的商品行,最后合并字段一次性构造DataFrame:

def get_random_orders(products, count=1000, start_order_id=1, number_of_customers=500):
    # 第一步:一次性抽取所有订单需要的随机商品行(允许重复采样适配多订单选同商品的场景)
    sampled_products = products.sample(n=count, replace=True).reset_index(drop=True)
    
    # 第二步:批量生成订单专属字段
    customer_ids = [get_customer_id(number_of_customers) for _ in range(count)]
    order_ids = [start_order_id + offset for offset in range(count)]
    order_dates = [get_order_date() for _ in range(count)]
    
    # 第三步:拼接订单字段与采样的商品字段
    sampled_products.insert(0, 'customer_id', customer_ids)
    sampled_products.insert(1, 'order_id', order_ids)
    sampled_products.insert(2, 'order_date', order_dates)
    
    # 按要求调整列顺序后返回
    return sampled_products[['customer_id', 'order_id', 'order_date', 'SKU', 'price', 'category', 'size', 'color', 'style', 'gender']]

该实现可以无缝适配你后续要支持的「每个订单随机生成明细行数」的需求:只需先为每个订单生成对应的明细行数,按总明细行数批量随机采样商品,最后和订单字段做对齐拼接即可,不需要改动核心框架逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 05:24:01