Pandas:数据帧到矩阵
Pandas: Dataframe to Matrix
我对这个话题很陌生。我目前正在开发一种潜在因子矩阵分解,它将作为神经网络的训练数据。
我有一个这样的 csv table:
user_id song_id playcount
frank SOBYHAJ12A6701BF1D 23
john SODACBL12A8C13C273 1
john SODXRTY12AB0180F3B 3
mary SOFRQTD12A81C233C0 1
您可以将此 table 视为对矩阵的描述。我想构建一个矩阵:
rows=song_id, columns=user_id, value=playcount
我已将数据加载到 pandas 数据帧中:
triplets_training_set = pd.read_csv(filepath)
现在我想用该数据构建一个稀疏矩阵。
另一个问题:
我需要向量化值吗?即将'b80344d063b5ccb3212f76538f3d9e43d87dca9e'翻译成整数user_id? (相同的
song_id)
我读过这样的问题,但我不知道如何处理最后一个问题
我想出的唯一解决方案是首先制作 2 个命令,例如:
{ frank: 1, john: 2, mary:3, ..}
{ SOBYHAJ12A6701BF1D:1 , SODACBL12A8C13C273:2. ..}
然后逐行遍历数据帧triplets_training_set,构建矩阵。但这是一个天真的解决方案。一定有更好的。
提前致谢!
您可以使用sklearn.preprocessing.LabelEncoder
to encode the user_id
and song_id
fields into integers. These could then be used as the indices for your matrix. From there I would use your matrix of choice from scipy.sparse
加载数据。类似于以下内容:
from sklearn.preprocessing import LabelEncoder
from scipy import sparse as ss
le = LabelEncoder()
user_ids = le.fit_transform(df.user_id)
song_ids = le.fit_transform(df.song_id)
sarr = ss.csr_matrix((df.playcount, (user_ids, song_ids)))
sarr
<3x4 sparse matrix of type '<class 'numpy.int64'>'
with 4 stored elements in Compressed Sparse Row format>
sarr.todense()
matrix([[23, 0, 0, 0],
[ 0, 1, 3, 0],
[ 0, 0, 0, 1]], dtype=int64)
这是你想要的吗?
df.pivot(*df.columns)
Out[648]:
song_id SOBYHAJ12A6701BF1D SODACBL12A8C13C273 SODXRTY12AB0180F3B \
user_id
frank 23.0 NaN NaN
john NaN 1.0 3.0
mary NaN NaN NaN
song_id SOFRQTD12A81C233C0
user_id
frank NaN
john NaN
mary 1.0
我对这个话题很陌生。我目前正在开发一种潜在因子矩阵分解,它将作为神经网络的训练数据。
我有一个这样的 csv table:
user_id song_id playcount
frank SOBYHAJ12A6701BF1D 23
john SODACBL12A8C13C273 1
john SODXRTY12AB0180F3B 3
mary SOFRQTD12A81C233C0 1
您可以将此 table 视为对矩阵的描述。我想构建一个矩阵:
rows=song_id, columns=user_id, value=playcount
我已将数据加载到 pandas 数据帧中:
triplets_training_set = pd.read_csv(filepath)
现在我想用该数据构建一个稀疏矩阵。
另一个问题:
我需要向量化值吗?即将'b80344d063b5ccb3212f76538f3d9e43d87dca9e'翻译成整数user_id? (相同的 song_id)
我读过这样的问题,但我不知道如何处理最后一个问题
我想出的唯一解决方案是首先制作 2 个命令,例如:
{ frank: 1, john: 2, mary:3, ..}
{ SOBYHAJ12A6701BF1D:1 , SODACBL12A8C13C273:2. ..}
然后逐行遍历数据帧triplets_training_set,构建矩阵。但这是一个天真的解决方案。一定有更好的。
提前致谢!
您可以使用sklearn.preprocessing.LabelEncoder
to encode the user_id
and song_id
fields into integers. These could then be used as the indices for your matrix. From there I would use your matrix of choice from scipy.sparse
加载数据。类似于以下内容:
from sklearn.preprocessing import LabelEncoder
from scipy import sparse as ss
le = LabelEncoder()
user_ids = le.fit_transform(df.user_id)
song_ids = le.fit_transform(df.song_id)
sarr = ss.csr_matrix((df.playcount, (user_ids, song_ids)))
sarr
<3x4 sparse matrix of type '<class 'numpy.int64'>'
with 4 stored elements in Compressed Sparse Row format>
sarr.todense()
matrix([[23, 0, 0, 0],
[ 0, 1, 3, 0],
[ 0, 0, 0, 1]], dtype=int64)
这是你想要的吗?
df.pivot(*df.columns)
Out[648]:
song_id SOBYHAJ12A6701BF1D SODACBL12A8C13C273 SODXRTY12AB0180F3B \
user_id
frank 23.0 NaN NaN
john NaN 1.0 3.0
mary NaN NaN NaN
song_id SOFRQTD12A81C233C0
user_id
frank NaN
john NaN
mary 1.0