如何使用矢量列从DataFrame创建张量流数据集?

时间:2018-06-01 10:39:08

标签: python pandas dataframe tensorflow

所以我在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函数,因此将xy视为数组。下一步是使用以下内容创建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字符串?是否不允许使用矢量要素列?或者我做错了什么?请给我一些启示

2 个答案:

答案 0 :(得分:2)

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')

答案 1 :(得分:0)

查看制作数据集的其他答案。如果遇到features should be a dictionary of `Tensor`s.错误,请使用以下命令:

def dfToFeature(df):
    result = {}
    for key in df.keys():
        result[key] = np.vstack(df[key])
    return result