前一段时间发现从一个 DataFrame 中提取出一个Series. 不管被提取的 Series 的每一个值是不是一个 ndarray,返回值永远是一个一维的 ndarray.
发现问题
比如有一个 Dataframe
1 | # each label_embed_vector contains 100 vectors. |
直接用 df['label_embed_vector']来读取数据的话,返回的是一个小的 dataframe. 这个时候就需要使用 Dataframe.values 来读取数据. 这个方法会返回一个包含数据的 numpy array. 但是这个 ndarry 只是 1 维的.
在pandas.DataFrame.values的官方文档里,说推荐pandas.DataFrame.to_numpy 来代替 values 方法. 但是使用推荐的方法以后返回的结果还是 1 维的:
1 | # 使用`to_numpy`方法来读取`label_embed_vector`的数据以后发现他返回的是一个 shape 为 (86,)的 ndarray. |
上面的输出很奇怪, 从读取的数据来看的话, data 是一个(86,100)的 ndarray. 但是 data 的 shape 却是(86,).
原因和解决方案
通过 print 来检查数据以后发现, 虽然数据结构类似而且读取数据的时候和多维数组一样, 不过输出的数组确实不是多维度的:
1 | # printout 检查数据 |
解决方案
经过搜索发现 Pandas 这样做的原因是不能确定每一个 row 的 array 的长度是一样的, 因此返回的是一维数据. 这个时候可以用np.vstack来手动把一位数据来转化成多维数据. 比如:
1 | data = np.vstack(df['label_embed_vector'].to_numpy()) |