如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?

Posted

技术标签:

【中文标题】如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?【英文标题】:How to convert vector wrapped as string to numpy array in pandas dataframe? 【发布时间】:2018-01-24 02:11:43 【问题描述】:

我有一个带有一列向量的 pandas 数据框,我想对其执行矩阵算术运算。然而,仔细观察后,这些向量都被包装成字符串,其中似乎嵌入了换行符:

如何将此列中的每个向量转换为 numpy 数组?我试过了

df['Word Vector'].as_matrix

np.array(df['Word Vector'])

还有

df['Word Vector'] = df['Word Vector'].astype(np.array)

但没有一个产生预期的结果。任何指针将不胜感激!

【问题讨论】:

提供一个我们可以试验的数据示例。 @MedAli 最好的方法是什么?我不确定生成这种格式的过程,如何将数据帧的样本上传到 ***? 【参考方案1】:

希望以下工作如您所愿

import pandas as pd
import numpy as np

x = str(np.arange(1,100))
df = pd.DataFrame([x,x,x,x])
df.columns = ['words']
print 'sample'
print df.head()
result = df['words'].apply(lambda x: 
                           np.fromstring(
                               x.replace('\n','')
                                .replace('[','')
                                .replace(']','')
                                .replace('  ',' '), sep=' '))
print 'result'
print result

输出如下

    sample
                                               words
0  [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 ...
1  [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 ...
2  [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 ...
3  [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 ...
result
0    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, ...
1    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, ...
2    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, ...
3    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, ...

这么多次调用replace函数并不优雅。但是我没有找到更好的方法。无论如何,它应该可以帮助您将字符串转换为向量。

附注,由于数据显示在图片中,您最好检查您的数据分隔是通过空格还是制表符完成的。如果是tab,将sep=' '改为sep='\t'

【讨论】:

【参考方案2】:

这对我来说适用于 Pandas 列中的字符串列表:

df['Numpy Word Vector'] = df['Word Vector'].apply(eval).apply(np.array)

【讨论】:

【参考方案3】:

下面的解决方案更短:

df[col_name] = df[col_name].apply(lambda x: np.array(eval(x)), 0)

例子:

df = pd.DataFrame(['[0., 1., 2., 3.]', '[1., 2., 3., 4.]'], columns=['Word Vector'])
df['Word Vector'][0] # '[0., 1., 2., 3.]'

df['Word Vector'] = df['Word Vector'].apply(lambda x: np.array(eval(x)), 0)
df['Word Vector'][0] # array([0., 1., 2., 3.])

【讨论】:

以上是关于如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?的主要内容,如果未能解决你的问题,请参考以下文章

将纪元时间转换为熊猫数据框中的格式化日期字符串

将字符串的所有字母字符转换为熊猫数据框中单独列中的整数

如何将熊猫中的timedelta列转换为字符串

如何将包含列表的列转换为熊猫数据框中的单独列? [复制]

熊猫数据框列有带逗号的字符串如何将其转换为列表[关闭]

如何将熊猫单列数据框转换为系列或numpy向量[重复]