熊猫:数据框到矩阵

时间:2018-01-12 18:31:51

标签: python pandas matrix scikit-learn sparse-matrix

我对这个话题很陌生。我目前正在开发一种潜在因子矩阵分解,它将为神经网络训练数据。

我有一个像这样的csv表:

user_id song_id playcount
frank   SOBYHAJ12A6701BF1D  23
john    SODACBL12A8C13C273  1
john    SODXRTY12AB0180F3B  3
mary    SOFRQTD12A81C233C0  1

您可以将此表视为矩阵的描述。我想建立一个矩阵:

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 ,构造矩阵。但这是一个天真的解决方案。必须有一个更好的。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以使用sklearn.preprocessing.LabelEncoderuser_idsong_id字段编码为整数。然后可以将它们用作矩阵的索引。从那里我将使用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)

答案 1 :(得分:0)

这是你想要的吗?

public class ChatappMsg {

    private String messageBody;
    private String messageAt;
    private String messageBy;
    private String messageType;
    private int messageID;

    public String getMessageBody() {
        return messageBody;
    }

    public void setMessageBody(String messageBody) {
        this.messageBody = messageBody;
    }

    public String getMessageAt() {
        return messageAt;
    }

    public void setMessageAt(String messageAt) {
        this.messageAt = messageAt;
    }

    public String getMessageBy() {
        return messageBy;
    }

    public void setMessageBy(String messageBy) {
        this.messageBy = messageBy;
    }

    public String getMessageType() {
        return messageType;
    }

    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }

    public int getMessageID() {
        return messageID;
    }

    public void setMessageID(int messageID) {
        this.messageID = messageID;
    }

    public ChatappMsg(String messageBody, String messageAt, String messageBy, String messageType, int messageID) {
        this.messageBody = messageBody;
        this.messageAt = messageAt;
        this.messageBy = messageBy;
        this.messageType = messageType;
        this.messageID = messageID;
    }

    @Override
    public String toString() {
        return "ChatappMsg{" +
                "messageBody='" + messageBody + '\'' +
                ", messageAt='" + messageAt + '\'' +
                ", messageBy='" + messageBy + '\'' +
                ", messageType='" + messageType + '\'' +
                ", messageID='" + messageID + '\'' +
                '}';
    }
}