Skip to main content
 首页 » 编程设计

python之如何从具有向量列的 DataFrame 创建 tensorflow 数据集

2024年09月07日34zdz8207

所以我在 csv 文件 train.csv 中有一些火车数据,格式如下:

x;y;type 
[1,2,3];[2,3,4];A 
[2,7,9];[0,1,2];B 

此文件被解析为具有以下内容的 pd.DataFrame:

CSV_COLUMN_NAMES = ['x', 'y', 'type'] 
train = pd.read_csv("train.csv", names=CSV_COLUMN_NAMES, header=0, delimiter=";") 
train['x'] = train['x'].apply(literal_eval) 
train['y'] = train['y'].apply(literal_eval) 

到目前为止一切顺利。应用了 literal_eval 函数,因此 x 和 y 被视为数组。下一步是使用以下内容创建 DataSet:

features, labels = train, train.pop('type') 
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels)) 

这就是它崩溃的地方:(它会溢出以下错误:

TypeError: Expected binary or unicode string, got [1, 2, 3] 

为什么需要二进制或 unicode 字符串?矢量特征列是不允许的吗?还是我做错了什么?请给我一些启示

请您参考如下方法:

只要只有一种数据类型,TF 就可以自动从数据框中创建张量,在这种情况下,它似乎有不同的数据类型。

没有 literal_eval 代码似乎可以工作,因为每个特征都是字符串而不是混合类型:

train = pd.read_csv("train.csv", names=CSV_COLUMN_NAMES, header=0, delimiter=",") 
 
Features,labels = train,train.pop('type') 
 
dataset = tf.data.Dataset.from_tensor_slices((dict(Features), labels)) 
iterator = dataset.make_initializable_iterator() 
next_element = iterator.get_next() 
 
with tf.Session() as sess: 
  sess.run(iterator.initializer) 
  print(sess.run(next_element)) 
  print(sess.run(next_element)) 

输出:

({'y': b'[2, 3, 4]', 'x': b'[1, 2, 3]'}, b'A') 
({'y': b'[0, 1, 2]', 'x': b'[2, 7, 9]'}, b'B') 

基于此解决方案:( How to convert a Numpy 2D array with object dtype to a regular 2D array of floats ) 如果我们将混合对象类型转换为相同类型(使用 np.vstack),它会起作用。

train['x'] = train['x'].apply(literal_eval) 
train['y'] = train['y'].apply(literal_eval) 
 
Features,labels = train,train.pop('type') 
dataset = tf.data.Dataset.from_tensor_slices(((np.vstack(Features['x']),    np.vstack(Features['y'])), labels)) 
 
iterator = dataset.make_initializable_iterator() 
next_element = iterator.get_next() 
 
with tf.Session() as sess: 
   sess.run(iterator.initializer) 
   print(sess.run(next_element)) 
   print(sess.run(next_element)) 

输出:

((array([1, 2, 3]), array([2, 3, 4])), b'A') 
((array([2, 7, 9]), array([0, 1, 2])), b'B')