【问题标题】:how to convert a dataframe to tensor如何将数据帧转换为张量
【发布时间】:2021-05-28 02:06:15
【问题描述】:

我有一个这样的数据框:

         ids  dim
0         1    2
1         1    0
2         1    1
3         2    1
4         2    2
5         3    0
6         3    2
7         4    1
8         4    2
9         Nan  0
10        Nan  1
11        Nan  0

我想用它构建一个张量流张量,结果如下所示: 这里的列对应于df 中的dim 列,因为我们有三个不同的值(0, 1,2),等效张量将有三列。

而张量的值就是df中关联的id

1   1   1
Nan 2   2
3   Nan 3
Nan 4   4

我做了什么:

我尝试将 df 转换为 numpy,然后将其转换为张量,但是结果看起来不像我想要的:

tf.constant(df[['ids', 'dim']].values, dtype=tf.int32)

【问题讨论】:

  • 任何帮助表示赞赏:)。
  • 接受的答案和你想要的输出不一样。这可能会让未来的读者感到困惑。

标签: python pandas numpy tensorflow


【解决方案1】:

检查我的代码:

import numpy as np
import pandas as pd
import tensorflow as tf


df = pd.DataFrame([[1, 2],
                   [1, 0],
                   [1, 1],
                   [2, 1],
                   [2, 2],
                   [3, 0],
                   [3, 2],
                   [4, 1],
                   [4, 2],
                   [np.nan, 0],
                   [np.nan, 1],
                   [np.nan, 0]], columns=['ids', 'dim'])
dim_array = np.array(df['dim'])
sort = dim_array.argsort()
final = np.array([df.ids[sort]]).reshape((3, 4)).T
final_result = tf.constant(final, dtype=tf.int32) # use tf.float32 to retain nan in tensor
print(final_result)

# <tf.Tensor: shape=(4, 3), dtype=int32, numpy=
# array([[          1,           1,           1],
#        [          3,           2,           2],
#        [-2147483648,           4,           3],
#        [-2147483648, -2147483648,           4]], 
# dtype=int32)>

在张量流中nan 会损失一些值。

【讨论】:

  • 感谢@Exploore X,它运行良好。不过,我有一个快速的问题。当我设置dtype=tf.int32 时,我看到-2147483648 是一些我猜它而不是NAN 的元素。但是,当我更改为 dtype=tf.int16 时,它没有显示该数字。你知道这是为什么吗?
  • 基本上np.nan是浮点数,默认是32bit(4Byte)。当您将其更改为 int32 时,32 位的 int16 值无法放入 16 位缓冲区,因此它将变为 0。
  • 要在张量中保留 nan,请使用 tf.float32 而不是 'tf.int32' 或 int16
  • 非常感谢您的解释
【解决方案2】:

您可以使用pd.pivot_table() 进行简洁的计算

df = pd.DataFrame([[1, 2],
                   [1, 0],
                   [1, 1],
                   [2, 1],
                   [2, 2],
                   [3, 0],
                   [3, 2],
                   [4, 1],
                   [4, 2],
                   [np.nan, 0],
                   [np.nan, 1],
                   [np.nan, 0]], columns=['ids', 'dim'])

df['val'] = 1
df = df.pivot_table(index='ids',columns='dim',values='val') 
df = df.multiply(np.array(df.index), axis=0)

tensor = tf.constant(df)

【讨论】:

    【解决方案3】:

    试试 torch item=torch.tensor(df.values)

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 2018-10-22
      • 2017-07-06
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多