将具有混合列类型(数值,序数和类别)的熊猫数据帧转换为Scipy稀疏数组是机器学习中的中心问题。
现在,如果我的熊猫的数据框仅由数字数据组成,则执行以下操作I can simply do将数据框转换为稀疏的csr矩阵:
scipy.sparse.csr_matrix(df.values)
如果我的数据框由序数数据类型组成,则可以使用LabelEncoder
处理它们from collections import defaultdict
d = defaultdict(LabelEncoder)
fit = df.apply(lambda x: d[x.name].fit_transform(x))
然后,我可以再次使用以下内容,问题已解决:
scipy.sparse.csr_matrix(df.values)
具有少量数值的分类变量也不是问题。可以使用pd.get_dummies(Pandas或Scikit-Learn版本)轻松处理它们。
我主要关心的是具有大量值的分类变量。
主要问题:如何处理具有大量值的分类变量?
pd.get_dummies(train_set, columns=[categorical_columns_with_large_number_of_values], sparse=True)
需要很多时间。
This question似乎给出了有趣的方向,但尚不清楚它是否有效地处理了所有数据类型。
如果您知道有效的方法,请告诉我。谢谢。
答案 0 :(得分:1)
您可以使用factorize
轻松地将任何单列转换为稀疏的COO数组。这将比构建巨大的密集数据帧快得多。
import pandas as pd
import scipy.sparse
data = pd.DataFrame({"A": ["1", "2", "A", "C", "A"]})
c, u = pd.factorize(data['A'])
n, m = data.shape[0], u.shape[0]
one_hot = scipy.sparse.coo_matrix((np.ones(n, dtype=np.int16), (np.arange(n), c)), shape=(n,m))
您将获得如下所示的内容:
>>> one_hot.A
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 1, 0]], dtype=int16)
>>> u
Index(['1', '2', 'A', 'C'], dtype='object')
行是数据框的行,列是列的因素(u
将按顺序为这些列添加标签)