如何将含向量嵌入列的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
相关产品推荐
相关产品推荐

