jac*_*078 5 python dataframe pandas tensorflow
所以我在 csv 文件中有一些训练数据,train.csv格式如下:
x;y;type
[1,2,3];[2,3,4];A
[2,7,9];[0,1,2];B
Run Code Online (Sandbox Code Playgroud)
该文件被解析为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)
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。该literal_eval函数如此应用x并被y视为数组。下一步是DataSet使用以下内容创建一个:
features, labels = train, train.pop('type')
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
Run Code Online (Sandbox Code Playgroud)
这就是它崩溃的地方:(它会溢出以下错误:
TypeError: Expected binary or unicode string, got [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
为什么需要二进制或 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))
Run Code Online (Sandbox Code Playgroud)
输出:
({'y': b'[2, 3, 4]', 'x': b'[1, 2, 3]'}, b'A')
({'y': b'[0, 1, 2]', 'x': b'[2, 7, 9]'}, b'B')
Run Code Online (Sandbox Code Playgroud)
基于此解决方案:(How to conversion 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))
Run Code Online (Sandbox Code Playgroud)
输出:
((array([1, 2, 3]), array([2, 3, 4])), b'A')
((array([2, 7, 9]), array([0, 1, 2])), b'B')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7970 次 |
| 最近记录: |