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)。真不错!很高兴你能帮忙!周末愉快!