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

基于列名更新Pandas DataFrame值的高效方法求助

高效更新Pandas DataFrame指定列的方案

现有如下Pandas DataFrame:

x_1 x_2 x_3 x_4 col_to_replace cor_factor
    1   2   3   4   x_2            1
    3   3   5   1   x_1            6
    2   2   0   0   x_3            0
...

需求:根据col_to_replace列存储的列名,用cor_factor的值更新对应列,同时更新cor_factor列本身。当前使用的逐行循环方案效率极差:

for i in len(df.shape[0]):
    df[df['col_to_replace']].iloc[i] = df[df['col_to_replace']].iloc[i] - df['cor_factor'].iloc[i]                                                                          
    df['cor_factor'].iloc[i] = df['cor_factor'].iloc[i] -  df[df['col_to_replace']].iloc[i]                                                                         

预期输出:

x_1 x_2 x_3 x_4 col_to_replace cor_factor
    1   1   3   4   x_2            -1
    -3  3   5   1   x_1            3
    2   2   0   0   x_3            0
...

高效实现方案

利用Pandas矢量化操作替代逐行循环,大幅提升执行效率,具体步骤如下:

  1. 提取每行待更新列的原始值
    通过df.lookup一次性获取所有行中col_to_replace指定列的数值:
lookup_vals = df.lookup(df.index, df['col_to_replace'])
  1. 计算新值
    根据需求推导公式(避免重复计算):
  • 目标列新值 = 原始值 - cor_factor值
  • cor_factor新值 = cor_factor值 - 目标列新值 = 2 * df['cor_factor'] - lookup_vals
new_col_vals = lookup_vals - df['cor_factor']
new_cor_vals = df['cor_factor'] - new_col_vals
  1. 批量更新DataFrame
    仅对col_to_replace中的唯一列名循环,结合掩码批量赋值:
# 更新各目标列
for col in df['col_to_replace'].unique():
    mask = df['col_to_replace'] == col
    df.loc[mask, col] = new_col_vals[mask]

# 更新cor_factor列
df['cor_factor'] = new_cor_vals

效率说明

矢量化操作基于numpy底层优化,避免了Python逐行循环的开销;仅针对唯一列名循环,当col_to_replace的唯一值数量远小于总行数时,效率提升极为显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:03:36