基于列名更新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矢量化操作替代逐行循环,大幅提升执行效率,具体步骤如下:
- 提取每行待更新列的原始值
通过df.lookup一次性获取所有行中col_to_replace指定列的数值:
lookup_vals = df.lookup(df.index, df['col_to_replace'])
- 计算新值
根据需求推导公式(避免重复计算):
- 目标列新值 = 原始值 - 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
- 批量更新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
相关产品推荐
相关产品推荐

