pandas基于位置索引为DataFrame赋值的高效实现方法问询
高效实现方案
你可以直接用Numpy的花式索引完成批量赋值,完全规避Python层的循环,处理大规模数据时性能提升非常明显:
import numpy as np import pandas as pd # 你的原始数据 df_pos = pd.DataFrame( data = [[5,4,3,6,0,7,1,2], [2,5,3,6,4,7,1,0]] ) df_value = pd.DataFrame( data=[np.arange(10 + i, 50 + i, 5) for i in range(0,2)] ) # 高效实现逻辑 arr_final = np.zeros_like(df_value) # 生成和df_pos形状匹配的行索引广播数组 row_idx = np.arange(len(df_pos))[:, np.newaxis] # 花式索引批量赋值,所有操作在底层C层面执行 arr_final[row_idx, df_pos.values] = df_value.values # 转换为DataFrame格式 df_final = pd.DataFrame(arr_final, columns=df_value.columns, index=df_value.index)
方案说明
- 没有Python循环的额外开销,所有计算逻辑都在Numpy底层执行,百万行级别的数据表也可以在毫秒级完成处理,比原循环写法性能提升至少2~3个数量级。
- 赋值逻辑和原循环完全一致:逐行把
df_value第i行的数值,按df_pos第i行指定的列位置,填入到目标数组的对应位置。
注意:该实现默认
df_pos中的所有位置索引均合法(不超过df_value的最大列索引),和你原循环逻辑的报错规则完全一致。
结果验证
你可以用以下代码对比该实现和原循环实现的结果一致性:
# 原循环实现结果 df_value_copy = df_value.copy() for i in range(len(df_pos)): df_value_copy.iloc[i, df_pos.iloc[i, :]] = df_value.iloc[i].values print((df_final == df_value_copy).all().all()) # 输出True说明结果完全相同
内容的提问来源于stack exchange,提问作者hkbgner
相关产品推荐
相关产品推荐

