如何对pandas分类编码转嵌入的操作进行向量化优化
优化方案
原来的代码性能差主要来自两个高开销操作:一是用iterrows逐行遍历,二是反复拼接小体量DataFrame,这两个操作在pandas中都属于性能重灾区,用向量化操作替换后可以把耗时降到毫秒级。
步骤1:预生成列级embedding映射
import pandas as pd import numpy as np # 存储每列的分类值到30维embedding向量的映射 col_embedding_mapping = {} for col_idx, col_name in enumerate(encoded.columns): # 取出当前列对应的embedding层权重,形状为 (当前列唯一值数量, 30) emb_weights = model_full.get_layer(embeddings[col_idx]).get_weights()[0] # 取出当前列的唯一分类值,顺序和emb_weights的行顺序一一对应 unique_codes = encoded[col_name].unique() # 构造映射字典:分类值直接对应对应的embedding向量 col_embedding_mapping[col_name] = dict(zip(unique_codes, emb_weights))
步骤2:批量映射拼接得到最终结果
完全避免逐行操作,按列批量转换后统一拼接:
emb_dfs = [] for col_name in encoded.columns: # 整列批量映射,得到形状为 (4200, 30) 的向量数组 col_emb_arr = np.vstack(encoded[col_name].map(col_embedding_mapping[col_name]).values) # 生成新列名 new_col_names = [f"{col_name}_{i}" for i in range(col_emb_arr.shape[1])] # 转成DataFrame存入列表 emb_dfs.append(pd.DataFrame(col_emb_arr, columns=new_col_names, index=encoded.index)) # 一次性拼接所有列的结果,得到4200×240的最终数据集 mapped_embeddings = pd.concat(emb_dfs, axis=1)
优化效果
4200行8列的规模下,上述代码运行时间不会超过1秒,相比原实现性能提升至少两个数量级。
内容的提问来源于stack exchange,提问作者Bigboss01
相关产品推荐
相关产品推荐

