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

Pandas DataFrame切片性能受前期子集赋值方式影响的问题求助

Pandas DataFrame切片性能受前期子集赋值方式影响的问题求助

最近我碰到了一个搞不懂的Pandas性能问题,在对DataFrame做切片操作时,之前给额外列赋值的方式居然会影响后续循环的执行速度!

我写了一段没有实际业务意义但能凸显问题的代码,逻辑如下:

  • 创建一个包含两类列的DataFrame:extra_columns和columns
  • 耗时的核心部分是循环里对columns切片的赋值操作

最让我百思不得其解的是,循环前给extra_columns赋值的不同方式,居然会让循环的性能产生天壤之别!

Python代码

import timeit

setup_stmt ="""
import pandas as pd
num_cols = 500
n_iter = 100
extra_column = [ "product"]
columns = [chr(i+65) for i in range(num_cols)]
index= range(n_iter)
"""

stmt1 ="""
df = pd.DataFrame(index = index, columns=extra_column + columns)
df["product"] = "x"
for i in index:
    df.loc[i,columns] = 0
"""

stmt2 ="""
df = pd.DataFrame(index = index, columns=extra_column + columns)
df.product = "x"            
for i in index:
    df.loc[i,columns] = 0
"""

stmt3 ="""
df = pd.DataFrame(index= index, columns=extra_column + columns)
df.loc[index,"product"] = "x"
for i in index:
    df.loc[i,columns] = 0
"""

stmt4 ="""
df = pd.DataFrame(index = index, columns=extra_column + columns)
for i in index:
    df.loc[i,columns] = 0
df["product"] = "x"
"""

print(f" stmt1 takes { timeit.timeit(setup= setup_stmt, stmt= stmt1,  number=10):2.2f} seconds" )
print(f" stmt2 takes { timeit.timeit(setup= setup_stmt, stmt= stmt2,  number=10):2.2f} seconds" )
print(f" stmt3 takes { timeit.timeit(setup= setup_stmt, stmt= stmt3,  number=10):2.2f} seconds" )
print(f" stmt4 takes { timeit.timeit(setup= setup_stmt, stmt= stmt4,  number=10):2.2f} seconds" )

输出结果

stmt1 takes 20.60 seconds
 stmt2 takes 0.46 seconds
 stmt3 takes 0.46 seconds
 stmt4 takes 0.46 seconds

备注:内容来源于stack exchange,提问作者user1573820

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 08:57:58