Pandas如何无lambda向量化实现单列值分配到对应多列
向量化替代方案
逐行调用apply加lambda的写法本质是Python层的循环,数据量稍大就会很慢,完全可以用pandas/numpy的原生向量化操作实现,性能提升非常明显。
方法1:numpy索引直接赋值(性能最优)
核心思路是直接定位每个值要填充的行列坐标,批量写入,全程没有Python层逐行循环:
import numpy as np # 提前拿到所有待填充列的列位置索引 col_pos = {col: i for i, col in enumerate(df.columns)} target_col_pos = np.array([col_pos[ref] for ref in df['REF']]) row_pos = np.arange(len(df)) # 批量赋值 df.values[row_pos, target_col_pos] = df['Val3'].to_numpy()
方法2:独热编码转换(写法最简洁)
用get_dummies生成REF列的独热矩阵,再和Val3列做乘法,自动把值映射到对应列:
# 生成映射矩阵 fill_mat = pd.get_dummies(df['REF']).mul(df['Val3'], axis=0) # 补全所有预设列,避免部分列无匹配值时缺失 fill_mat = fill_mat.reindex(columns=colList, fill_value=0) # 写回原DataFrame df[colList] = fill_mat
两种方法得到的结果和你原来逐行apply的输出完全一致。
性能参考:10万行规模的数据集下,原apply方案耗时约11~13s,上述两种向量化方案耗时均在10ms以内,性能差距可达千倍。
内容的提问来源于stack exchange,提问作者Nadim
相关产品推荐
相关产品推荐

