如何将含numpy数组的Pandas数据集转为TensorFlow数据集?
TensorFlow 2.12.0下将含numpy数组列的Pandas数据集转为TFDS的问题
场景说明
- 环境:TensorFlow 2.12.0、Python 3.11
- 数据集:经Pandas预处理后,
f_combined列每行是固定大小12的numpy数组,asthma_status列是字符串类型 - 尝试代码:
ds_tf = tf.data.Dataset.from_tensor_slices(( df['asthma_status'], df['f_combined'] ))
- 问题:运行报错,后续尝试添加batch操作、将
f_combined转为tf.constant均无效;但直接用numpy数组创建TFDS可正常运行。
问题1:我的代码哪里出错了?
核心问题是df['f_combined']是object类型的Pandas Series,里面存的是一个个独立的numpy数组,并非连续的二维数组结构。tf.data.Dataset.from_tensor_slices要求输入是能被解析为统一形状张量的结构,而这种嵌套的object列无法被TensorFlow直接识别,会因为数据维度不统一、内存不连续导致报错。
问题2:如何正确实现该转换?
提供两种可行方案:
方案一:将f_combined堆叠为二维numpy数组
import numpy as np import tensorflow as tf # 把f_combined列的所有numpy数组堆叠成(N, 12)的二维数组 features = np.stack(df['f_combined'].values) labels = df['asthma_status'].values # 创建TF数据集 ds_tf = tf.data.Dataset.from_tensor_slices((features, labels))
np.stack会把每行的12维数组拼接成连续的二维数组,TensorFlow能直接识别为形状一致的张量,字符串类型的labels也能被正常处理。
方案二:使用生成器创建数据集(适合大内存占用场景)
def data_generator(): for _, row in df.iterrows(): yield row['f_combined'], row['asthma_status'] # 指定每个样本的类型和形状(根据你的数组实际 dtype 调整) output_signature = ( tf.TensorSpec(shape=(12,), dtype=tf.float32), tf.TensorSpec(shape=(), dtype=tf.string) ) ds_tf = tf.data.Dataset.from_generator( data_generator, output_signature=output_signature )
通过生成器逐行读取数据,同时指定输出签名让TensorFlow明确每个样本的结构,避免嵌套数组带来的解析问题。
问题3:Pandas中进一步预处理的替代方案
如果上述方法仍有问题,可在Pandas中将嵌套数组拆分为扁平列:
# 将f_combined的每个元素拆成单独列 f_flat = pd.DataFrame(df['f_combined'].tolist(), columns=[f'feat_{i}' for i in range(12)]) # 合并原标签列和新特征列 processed_df = pd.concat([df['asthma_status'], f_flat], axis=1) # 转换为TF数据集 ds_tf = tf.data.Dataset.from_tensor_slices(( processed_df.drop('asthma_status', axis=1).values, processed_df['asthma_status'].values ))
把12维数组拆成12个独立的数值列后,整个数据集都是常规的表格结构,TensorFlow可以直接解析,无需处理object类型列。
内容的提问来源于stack exchange,提问作者Dhairya Gupta
相关产品推荐
相关产品推荐

