如何将包装为字符串的向量转换为熊猫数据框中的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数组?的主要内容,如果未能解决你的问题,请参考以下文章