在python中,如何从具有功能列表字符串的tsv转换为csr矩阵?

在python中,如何从具有功能列表字符串的tsv转换为csr矩阵?,python,sparse-matrix,similarity,Python,Sparse Matrix,Similarity,我一直在使用一些R软件包从稀疏二进制矩阵计算(余弦)(稀疏)相似矩阵,例如proxyC 由于我现在也开始(并正在学习)使用python,而且有人告诉我它可能更快,我想尝试在那里运行同样的计算 我发现这个有趣的帖子: 其中介绍了几种方法 在亲手编写了一个小测试矩阵之后,我尝试了其中的一些测试。 现在我想尝试“真实”数据。 这就是我遇到的一个我目前无法解决的问题 我的数据来自tsv文件,这些文件将对象(ID)与逗号分隔的要素列表(FP)相关联。例如: 我需要将其转换为稀疏二进制矩阵。 即使在R中,

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

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

我发现这个有趣的帖子:

其中介绍了几种方法

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

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

我需要将其转换为稀疏二进制矩阵。
即使在R中,我也花了一些时间来找出最好的方法。
首先,
strsplit
FP以逗号列出,将
FP
列从字符向量转换为字符向量列表。然后我
unlist
FP
,重复每个
ID
的次数与
FP
向量的
长度一样多,这给了我:

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索引整数,这可能是个好主意)


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

谢谢!我确认我要花很长时间才能解决这个问题。我肯定也必须将ID列转换为category,否则我会有一个不需要的0行。为了确保不扰乱相似性矩阵,我需要按递增ID对初始数据帧进行排序(顺便说一句,在R中也是如此)。我仍然有一个疑问:我是否应该将1的数据类型设置为整数,因为它永远不能是浮点,甚至不能是布尔值,因为我只关心功能的存在,而不关心它在单个ID中出现多少次?此外,为了加快相似度计算,您可以将数据类型设置为您想要的任何类型(例如,
np.ones(df.shape[0],dtype=bool)
)。您还可以始终获取分类因子的顺序(例如,
df['FP'])。类别为列提供轴标签。您也可以跟踪稀疏数据帧中的所有内容,但数学方面的限制更大(例如:
df\u sparse=pd.dataframe.sparse.from\u spmatrix(mat,index=df['ID'].cat.categories,columns=df['FP'].cat.categories)
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.]])
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.]])