Python 从Pandas数据帧中获取字符串列到TensorFLow模型的最佳方法是什么?

Python 从Pandas数据帧中获取字符串列到TensorFLow模型的最佳方法是什么?,python,pandas,tensorflow,categorical-data,one-hot-encoding,Python,Pandas,Tensorflow,Categorical Data,One Hot Encoding,假设我有一些包含一些字符串列的数据帧: Animal Name Age ... Cat Fluffy 2 ... Dog Denton 3 ... 我想把动物列(带有一组已知的值)输入到我的训练模型中(用于线性回归)。我查看了以下选项: tf.feature\u column.categorical\u column\u与词汇表\u list一起使用,但随后它似乎与tf.feature\u column.make\u parse\u example\u

假设我有一些包含一些字符串列的数据帧:

Animal  Name    Age  ...
Cat     Fluffy  2    ...
Dog     Denton  3    ...
我想把动物列(带有一组已知的值)输入到我的训练模型中(用于线性回归)。我查看了以下选项:

  • tf.feature\u column.categorical\u column\u与词汇表\u list
    一起使用,但随后它似乎与
    tf.feature\u column.make\u parse\u example\u spec
    和协议缓冲区一起使用
  • tf.one\u hot
    听起来可能有帮助,但示例代码确实没有帮助我理解

  • 或者我应该自己写一些东西来将字符串转换成数字/布尔数据吗?

    您可以使用
    tf.feature\u column.input\u layer
    函数来创建输入张量。首先,分类列必须包装为指示符或嵌入列

    例如:

    # Create columns
    vocab_list = ['a','b','c','d']
    letter_column = tf.feature_column.categorical_column_with_vocabulary_list(
        key="letter",
        vocabulary_list=vocab_list)
    embedded_column = tf.feature_column.embedding_column(letter_column, 8)
    indicator_column = tf.feature_column.indicator_column(letter_column)
    
    # Create features and use input_layer to get a tensor
    features = {'letter': ['c']}
    inp = tf.feature_column.input_layer(features,[embedded_column, indicator_column])
    
    # Print value of inp
    with tf.Session() as s:
      s.run([tf.global_variables_initializer(),
             tf.local_variables_initializer(),
             tf.tables_initializer()])
      print(s.run(inp))
    
    输出(前8个数字可能有所不同):


    inp
    是一个包含12个元素的张量。前8个是根据
    embedded\u列
    (可培训)计算的嵌入,后4个是
    indicator\u列
    值的多热表示

    可以忽略tf.feature\u列名称空间,如下所示:

    使用熊猫自动将字符串列编码为数值。原始数据框中的类别列将具有属性cat.codes。您可以创建一个新的pandas列并将这些cat.code复制到其中。新列将是一个数字列,并填充神经网络所需的数字

    使用如下代码查找类别列,并创建新列:

    str_cols = [cn for cn in d.columns if is_string_dtype(d[cn])]
    add_code_columns = [cn for cn in d.columns if (cn in cat_cols) and (cn in str_cols)]
    
    for cn in add_code_columns:
      codecolname = cn + "_code"
      if not codecolname in d.columns:
        d[codecolname] = d[cn].cat.codes
    
    str_cols = [cn for cn in d.columns if is_string_dtype(d[cn])]
    add_code_columns = [cn for cn in d.columns if (cn in cat_cols) and (cn in str_cols)]
    
    for cn in add_code_columns:
      codecolname = cn + "_code"
      if not codecolname in d.columns:
        d[codecolname] = d[cn].cat.codes