You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:54:04