Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将稀疏向量的字符串表示转换为数据帧_Python_Pandas_Sparse Matrix - Fatal编程技术网

Python 将稀疏向量的字符串表示转换为数据帧

Python 将稀疏向量的字符串表示转换为数据帧,python,pandas,sparse-matrix,Python,Pandas,Sparse Matrix,我有一个向量vec,其中每个元素都是稀疏向量的字符串表示。 我想要的输出是具有以下特征的PandasDataFrame: 索引:vecindex 列:稀疏向量索引 值:稀疏向量值 稀疏向量的编码格式为:,记录之间用一个空格分隔 以下是几行示例数据: vec = ["70:1.0000 71:1.0000 83:1.0000", "3:2.0000 8:2.0000 9:3.0000", "3:3.0000 185:1.0000 186:1.0000",

我有一个向量
vec
,其中每个元素都是稀疏向量的字符串表示。
我想要的输出是具有以下特征的Pandas
DataFrame

索引
vec
index
:稀疏向量索引
:稀疏向量值

稀疏向量的编码格式为
,记录之间用一个空格分隔

以下是几行示例数据:

vec = ["70:1.0000 71:1.0000 83:1.0000",
       "3:2.0000 8:2.0000 9:3.0000",
       "3:3.0000 185:1.0000 186:1.0000",
       "3:1.0000 8:1.0000 289:1.0000"]
这是我的预期输出:

          185     186     289       3      70      71       8      83       9
index                                                                        
0         NaN     NaN     NaN     NaN  1.0000  1.0000     NaN  1.0000     NaN
1         NaN     NaN     NaN  2.0000     NaN     NaN  2.0000     NaN  3.0000
2      1.0000  1.0000     NaN  3.0000     NaN     NaN     NaN     NaN     NaN
3         NaN     NaN  1.0000  1.0000     NaN     NaN  1.0000     NaN     NaN
我有一个使用and的有效解决方案,但它看起来既笨拙又低效:

import pandas as pd

dense = pd.DataFrame()

for i, row in enumerate(vec):
    tups = []
    for entry in row.split(): 
        tups.append(tuple([x for x in entry.split(':')]))

    dense = pd.concat([dense,
                       (pd.DataFrame
                          .from_records(tups, 
                                        index=[i]*len(tups), 
                                        columns=['key','val'])
                          .reset_index()
                          .pivot(index='index', 
                                 columns='key', 
                                 values='val')
                       )
                     ])
有谁能建议一种更干净的方法,最好是更好地利用熊猫功能的方法吗?
我正在使用的实际数据集相当大,因此,如果可能的话,我想利用原生熊猫中的性能优化

注:
-输出索引不需要标记为
index

-这不一定是一个纯粹的解决方案。例如,我研究了一些处理稀疏性的
sklearn
方法,但似乎没有一种适合解决此任务。

-我不确定这是否重要,但是在这个操作之后,我使用
密集
df
索引作为合并键,将生成的
数据帧
(称之为
密集
)与另一个
数据帧
(称之为
df
)合并。因此,在本例中,
vec
索引是
[0,1,2,3]
,输出
密集
需要保留这些索引

我认为您可以使用
列表理解
-首先用于拆分,然后使用
数据帧
构造函数将其转换为
dicts

print ([dict([y.split(':') for y in (x.split())]) for x in vec])
[{'83': '1.0000', '70': '1.0000', '71': '1.0000'}, 
 {'8': '2.0000', '3': '2.0000', '9': '3.0000'}, 
 {'185': '1.0000', '186': '1.0000', '3': '3.0000'}, 
 {'289': '1.0000', '8': '1.0000', '3': '1.0000'}]

df = pd.DataFrame([dict([y.split(':') for y in (x.split())]) for x in vec])
print (df)
      185     186     289       3      70      71       8      83       9
0     NaN     NaN     NaN     NaN  1.0000  1.0000     NaN  1.0000     NaN
1     NaN     NaN     NaN  2.0000     NaN     NaN  2.0000     NaN  3.0000
2  1.0000  1.0000     NaN  3.0000     NaN     NaN     NaN     NaN     NaN
3     NaN     NaN  1.0000  1.0000     NaN     NaN  1.0000     NaN     NaN
使用
NaN
s和字符串获取
DataFrame
,因此对于数值转换是必要的:

print (type(df.loc[0,'70']))
<class 'str'>

df = df.astype(float)
print (df)
   185  186  289    3   70   71    8   83    9
0  NaN  NaN  NaN  NaN  1.0  1.0  NaN  1.0  NaN
1  NaN  NaN  NaN  2.0  NaN  NaN  2.0  NaN  3.0
2  1.0  1.0  NaN  3.0  NaN  NaN  NaN  NaN  NaN
3  NaN  NaN  1.0  1.0  NaN  NaN  1.0  NaN  NaN

print (type(df.loc[0,'70']))
<class 'numpy.float64'>
打印(类型(df.loc[0,'70']))
df=df.astype(浮动)
打印(df)
185  186  289    3   70   71    8   83    9
0南南1.0 1.0南1.0南
1楠楠2.0楠楠2.0楠楠3.0
2 1.0 1.0楠3.0楠楠
3楠楠1.0楠楠1.0楠楠楠1.0楠楠楠楠楠
打印(类型(df.loc[0,'70']))

您是否有机会以其他格式保存您的
vec
?您的源数据集是什么?这是一个稀疏矩阵吗?不幸的是,我一直在处理
vec
的格式-它来自我无法控制的上游进程。谢谢@jezrael。您的解决方案比我的解决方案快大约两个数量级(5.52ms vs 648ms)。真不错!很高兴你能帮忙!周末愉快!