在稀疏CSR矩阵中添加多个熊猫列

时间:2020-06-27 00:53:58

标签: python pandas numpy scipy sparse-matrix

所以我的问题基于这个question

我有Twitter数据,我在其中提取了会标字符特征和拼字法特征的数量,例如感叹号,问号,大写和小写。我想将拼字法特征堆叠为转换后的字母组合特征。这是我的代码:

X_train, X_test, y_train, y_test = train_test_split(tweet_df[['tweets', 'exclamation', 'question', 'uppercase', 'lowercase']], tweet_df['class'], stratify=tweet_df['class'],
                                 test_size = 0.2, random_state=0)

count_vect = CountVectorizer(ngram_range=(1,1))
X_train_gram = count_vect.fit_transform(X_train['tweets'])

tfidf = TfidfTransformer()
X_train_gram = tfidf.fit_transform(X_train_gram)

X_train_gram = hstack((X_train_gram,np.array(X_train['exclamation'])[:,None]))

这行得通,但是我找不到一种在一行代码中将其余列(问题,大写,小写)合并到堆栈中的方法。这是失败的尝试:

X_train_gram = hstack((X_train_gram,np.array(list(X_train['exclamation'], X_train['question'], X_train['uppercase'], X_train['lowercase']))[:,None])) #list expected at most 1 arguments, got 4

X_train_gram = hstack((X_train_gram,np.array(X_train[['exclamation', 'question', 'uppercase', 'lowercase']])[:,None])) #expected dimension <= 2 array or matrix

X_train_gram = hstack((X_train_gram,np.array(X_train[['exclamation', 'question', 'uppercase', 'lowercase']].values)[:,None])) #expected dimension <= 2 array or matrix

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您在使用列表语法和创建sparse.coo_matrix时遇到问题。

np.array(X_train['exclamation'])[:,None])

Series的数组为1d,无,则变为(n,1)

np.array(list(X_train['exclamation'], X_train['question'], X_train['uppercase'], X_train['lowercase']))[:,None]

那不是有效的列表语法:

In [327]: list(1,2,3,4)                                                         
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-327-e06d60ac583e> in <module>
----> 1 list(1,2,3,4)

TypeError: list() takes at most 1 argument (4 given)

下一个:

np.array(X_train[['exclamation', 'question', 'uppercase', 'lowercase']])[:,None])

有多列,我们得到一个DataFrame;这将产生一个二维数组;添加None,并获得3d数组:

In [328]: np.ones((2,3))[:,None].shape                                          
Out[328]: (2, 1, 3)

无法通过3d数组制作coo矩阵。添加values不会改变。 np.array(dataframe)dataframe.values相同。

np.array(X_train[['exclamation', 'question', 'uppercase', 'lowercase']].values)[:,None]

这有可能起作用:

hstack((X_train_gram, np.array(X_train[['exclamation', 'question', 'uppercase', 'lowercase']].values))

尽管我建议写

arr = np.array(X_train[['exclamation', 'question', 'uppercase', 'lowercase']].values
M = sparse.coo_matrix(arr)
sparse.hstack(( X_train_gram, M))

它更具可读性,并且在出现问题时应该更容易调试。