如何从一个有功能列表字符串的TSV变成一个Python中的CSR矩阵?

How to go from a tsv with feature list strings to a csr matrix in python?(如何从一个有功能列表字符串的TSV变成一个Python中的CSR矩阵?)
本文介绍了如何从一个有功能列表字符串的TSV变成一个Python中的CSR矩阵?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用一些R包,它们从稀疏二进制矩阵计算(余弦)(稀疏)相似矩阵,例如proxyC

由于我现在也开始(并学习)使用python,而且有人告诉我它可能会更快,所以我想尝试在那里运行相同的计算。

我发现了这个有趣的帖子:

What's the fastest way in Python to calculate cosine similarity given sparse matrix data?

其中介绍了几种方法。

我自己手写了一个小测试矩阵后,确实尝试了其中的一些。
现在我想试一试"真实"数据。
这就是我遇到了一个目前无法解决的问题。

我的数据来自TSV文件,这些文件将对象(ID)与逗号分隔的功能列表(FP)相关联。例如:

ID  FP
1   A,B,C
2   A,D
3   C,D,F
4   A,F
5   E,H,M

我需要将其转换为稀疏二进制矩阵。
即使在R中,我也花了一些时间来找出最好的方法。
I首先strsplitFP按逗号列出,将FP列从字符向量转换为字符向量列表。然后我unlistFP,重复每个IDFP向量中的lengths一样多的次数,得到如下结果:

ID  FP
1   A
1   B
1   C
2   A
2   D
3   C
3   D
3   F
4   A
4   F
5   E
5   H
5   M

和我通过xtabs

生成稀疏二进制特征矩阵
5 x 8 sparse Matrix of class "dgCMatrix"
    FP
  ID A B C D E F H M
   1 1 1 1 . . . . .
   2 1 . . 1 . . . .
   3 . . 1 1 . 1 . .
   4 1 . . . . 1 . .
   5 . . . . 1 . 1 1

我相信在python中可以做到这一点(在这种情况下,从TSV文件到CSR矩阵,就像我链接的帖子中一样),但我仍然是一个初学者,我怀疑我需要很长时间才能弄清楚所有细节并将其弄清楚。

有人能帮我/指给我一些用例子描述必要步骤的帖子吗?

谢谢!

推荐答案

import pandas as pd
df = pd.DataFrame({'ID':[1,2,3], 'FP':["A,B,C","A,D","C,D,F"]})

>>> df
   ID     FP
0   1  A,B,C
1   2    A,D
2   3  C,D,F

拆分列并将其分解为长表

df['FP'] = df['FP'].str.split(",")
df = df.explode(column="FP")

>>> df
   ID FP
0   1  A
0   1  B
0   1  C
1   2  A
1   2  D
2   3  C
2   3  D
2   3  F

对分类列进行编码

df['FP'] = df['FP'].astype('category')

将其写入稀疏矩阵:

from scipy.sparse import csr_matrix
import numpy as np

mat = csr_matrix((np.ones(df.shape[0]), (df['ID'], df['FP'].cat.codes)))

>>> mat.A
array([[0., 0., 0., 0., 0.],
       [1., 1., 1., 0., 0.],
       [1., 0., 0., 1., 0.],
       [0., 0., 1., 1., 1.]])
确保跟踪哪些列是哪些分类级别。如果您愿意,也可以对ID列进行编码(如果它们不是0索引的整数,这可能是一个好主意)。

df['ID'] = df['ID'].astype('category')
mat = csr_matrix((np.ones(df.shape[0]), (df['ID'].cat.codes, df['FP'].cat.codes)))

>>> mat.A
array([[1., 1., 1., 0., 0.],
       [1., 0., 0., 1., 0.],
       [0., 0., 1., 1., 1.]])

同样,记录您的分类级别。

这篇关于如何从一个有功能列表字符串的TSV变成一个Python中的CSR矩阵?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)