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

如何将含向量嵌入列的Pandas Dataframe注册到Azure?

解决方案:处理含向量列的Pandas DataFrame注册Azure数据集

方案1:使用Parquet格式保存(推荐)

Parquet是二进制列式存储格式,能直接保留Pandas中列表类型的向量数据,无需转成字符串,避免CSV格式带来的解析问题,同时存储效率更高。

步骤代码:

# 1. 将DataFrame保存为Parquet文件
df.to_parquet("embeddings_data.parquet", index=False)

# 2. 上传到Azure默认数据存储
from azureml.core import Workspace, Datastore
ws = Workspace.from_config()
datastore = ws.get_default_datastore()
datastore.upload_files(
    files=["embeddings_data.parquet"],
    target_path="embeddings/parquet",
    overwrite=True
)

# 3. 注册为FileDataset
from azureml.core.dataset import Dataset
dataset = Dataset.File.from_files(path=(datastore, "embeddings/parquet/*.parquet"))
dataset.register(
    workspace=ws,
    name="embeddings_parquet_dataset",
    description="Dataset with embedding vectors stored in Parquet format"
)

# 4. 读取时恢复原DataFrame
loaded_df = dataset.to_pandas_dataframe()

方案2:用JSON序列化向量字符串

如果必须使用CSV格式,不要直接用Python默认的列表转字符串(如str([1.0, 2.0])),改用json.dumps序列化向量,确保字符串格式标准,同时在注册数据集时强制指定该列为字符串类型,避免Azure自动解析出错。

步骤代码:

import json
from azureml.core import Workspace, Datastore, Dataset
from azureml.data.dataset_factory import DataType

# 1. 用JSON序列化向量列
df["embedding_json"] = df["embedding"].apply(json.dumps)

# 2. 保存为CSV并上传
df.to_csv("embeddings_data.csv", index=False)
ws = Workspace.from_config()
datastore = ws.get_default_datastore()
datastore.upload_files(
    files=["embeddings_data.csv"],
    target_path="embeddings/csv",
    overwrite=True
)

# 3. 定义Schema,强制指定embedding_json列为字符串
schema = {
    "id": DataType.to_string(),  # 替换为你的其他列名和类型
    "embedding_json": DataType.to_string()
}

# 4. 注册为Tabular Dataset
dataset = Dataset.Tabular.from_delimited_files(
    path=(datastore, "embeddings/csv/*.csv"),
    set_column_types=schema
)
dataset.register(
    workspace=ws,
    name="embeddings_tabular_dataset",
    description="Dataset with JSON-serialized embedding vectors"
)

# 5. 读取时解析向量
loaded_df = dataset.to_pandas_dataframe()
loaded_df["embedding"] = loaded_df["embedding_json"].apply(json.loads)

方案3:Base64编码向量(适合高维向量)

对于高维向量,Base64编码可以将二进制数据转为紧凑的字符串,避免JSON序列化的冗余,同时同样需要强制指定列类型为字符串。

步骤代码:

import base64
import numpy as np
from azureml.core import Workspace, Datastore, Dataset
from azureml.data.dataset_factory import DataType

# 1. 定义编码/解码函数
def vector_to_base64(vec):
    vec_array = np.array(vec, dtype=np.float32)
    return base64.b64encode(vec_array.tobytes()).decode("utf-8")

def base64_to_vector(b64_str, shape=(1536,)):  # 替换为你的向量维度
    vec_bytes = base64.b64decode(b64_str)
    return np.frombuffer(vec_bytes, dtype=np.float32).reshape(shape).tolist()

# 2. 编码向量列
df["embedding_b64"] = df["embedding"].apply(vector_to_base64)

# 3. 保存CSV并上传
df.to_csv("embeddings_b64.csv", index=False)
ws = Workspace.from_config()
datastore = ws.get_default_datastore()
datastore.upload_files(
    files=["embeddings_b64.csv"],
    target_path="embeddings/b64",
    overwrite=True
)

# 4. 注册Tabular Dataset,指定列类型
schema = {
    "id": DataType.to_string(),
    "embedding_b64": DataType.to_string()
}

dataset = Dataset.Tabular.from_delimited_files(
    path=(datastore, "embeddings/b64/*.csv"),
    set_column_types=schema
)
dataset.register(
    workspace=ws,
    name="embeddings_b64_dataset",
    description="Dataset with Base64-encoded embedding vectors"
)

# 5. 读取时解码
loaded_df = dataset.to_pandas_dataframe()
loaded_df["embedding"] = loaded_df["embedding_b64"].apply(lambda x: base64_to_vector(x, shape=(1536,)))

错误原因说明

你遇到的Non-negative number required错误,是因为Azure Tabular Dataset尝试自动解析你直接转字符串的向量列(如[0.1, 0.2])为数值类型,而非保留字符串格式,解析过程中因格式不规范触发了参数异常。上述方案通过稳定的序列化方式+强制列类型指定,避免了自动解析的问题。

内容的提问来源于stack exchange,提问作者Irina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:05:06