如何用Pandas高效将df_matrix数据按索引填入df_main的depth列?
高效批量匹配矩阵值到主数据框的Pandas方案
场景说明
现有一个以整数为行/列索引的矩阵数据框df_matrix(示例shape为(4,5),实际规模更大),以及包含row_i、col_i列的主数据框df_main,需要将df_matrix中对应row_i和col_i位置的值填充到df_main的depth列。当前使用iterrows循环实现时,处理20万+行数据速度极慢,需替换为高效的Pandas原生方法。
高效实现方案
方案1:矩阵转长格式后合并(直观通用)
将宽格式的df_matrix转换为包含row_i、col_i、depth的长格式数据框,再通过merge与df_main匹配:
# 转换矩阵为长格式 df_matrix_long = df_matrix.reset_index().melt( id_vars='index', var_name='col_i', value_name='depth' ).rename(columns={'index': 'row_i'}) # 将col_i转为整数(melt后默认是字符串类型) df_matrix_long['col_i'] = df_matrix_long['col_i'].astype(int) # 合并到主数据框,保留原有所有行 df_main = df_main.merge(df_matrix_long, on=['row_i', 'col_i'], how='left')
方案2:使用Pandas lookup方法(简洁专用)
Pandas的lookup方法专门用于根据行列索引批量提取值,代码简洁高效:
df_main['depth'] = df_matrix.lookup(df_main['row_i'], df_main['col_i'])
注意:该方法在Pandas 1.2+版本中被标记为弃用,后续版本建议使用方案3。
方案3:Numpy向量化索引(性能最优)
直接操作底层Numpy数组进行向量化索引,是大数据量下速度最快的方案:
# 利用numpy数组的行列索引直接取值 df_main['depth'] = df_matrix.values[df_main['row_i'], df_main['col_i']]
方案对比
- 方案1:逻辑直观,适合需要保留长格式矩阵做后续处理的场景,性能远优于
iterrows,但略逊于后两种方案。 - 方案2:代码最简洁,但存在版本弃用风险。
- 方案3:完全向量化操作,性能最优,适合20万+行的大规模数据处理,推荐优先使用。
内容的提问来源于stack exchange,提问作者Dima Pest
相关产品推荐
相关产品推荐

