从压缩数据列表中创建一个非常大的稀疏矩阵csv

时间:2018-01-18 20:31:20

标签: python python-3.x pandas csv numpy

我有一个格式字典:

{
  "sample1": set(["feature1", "feature2", "feature3"]),
  "sample2": set(["feature1", "feature4", "feature5"]),
}

我有20M sample s和150K独特功能。

我想将其转换为格式为的csv:

sample,feature1,feature2,feature3,feature4,feature5
sample1,1,1,1,0,0
sample2,1,0,0,1,1

到目前为止我做了什么:

  1. ALL_FEATURES = list(set(features))
  2. with open("features.csv", "w") as f:
        f.write("fvecmd5," + ",".join([str(x) for x in ALL_FEATURES]) + "\n")
        fvecs_lol = list(fvecs.items())
        fvecs_keys, fvecs_values = zip(*fvecs_lol)
        del fvecs_lol
        tmp = [["1" if feature in featurelist else "0" for feature in ALL_FEATURES] for featurelist in fvecs_values]
        for i, entry in enumerate(tmp):
            f.write(fvecs_keys[i] + "," + ",".join(entry) + "\n")
    
  3. 但这种情况非常缓慢。有更快的方法吗?也许利用Numpy / Cython?

3 个答案:

答案 0 :(得分:3)

这是你需要的吗?

pd.Series(d).apply(','.join).str.get_dummies(sep=',')
Out[50]: 
         feature1  feature2  feature3  feature4  feature5
sample1         1         1         1         0         0
sample2         1         0         0         1         1

您可以在最后添加to_csv

这个怎么样

s=pd.Series(d).to_frame('v')

s.v=list(map(','.join,s.v.values))

s.v.str.get_dummies(sep=',')
Out[86]: 
         feature1  feature2  feature3  feature4  feature5
sample1         1         1         1         0         0
sample2         1         0         0         1         1

答案 1 :(得分:3)

您可以使用sklearn.feature_extraction.text.CountVectorizer生成稀疏矩阵,然后创建SparseDataFrame:

In [49]: s = pd.SparseSeries(d).astype(str).str.replace(r"[{,'}]",'')

In [50]: s
Out[50]:
sample1    feature1 feature2 feature3
sample2    feature1 feature5 feature4
dtype: object

In [51]: from sklearn.feature_extraction.text import CountVectorizer

In [52]: cv = CountVectorizer()

In [53]: r = pd.SparseDataFrame(cv.fit_transform(s),
                                s.index, 
                                cv.get_feature_names(), 
                                default_fill_value=0)

In [54]: r
Out[54]:
         feature1  feature2  feature3  feature4  feature5
sample1         1         1         1         0         0
sample2         1         0         0         1         1

答案 2 :(得分:0)

因此,您希望将CSV从稀疏表示转换为密集表示。

如何? 您可以将csv加载到稀疏矩阵中(查看scipy.coo_matrix哪种适合您的情况),转换为密集的numpy数组(使用np.array())并将其保存为CSV(可能通过首先列出清单

(或者你可以像其他人建议的那样使用一些奇特的熊猫编码。)

但是,真正的问题是,为什么要以密集格式存储如此大的数据集?它在内存/磁盘空间中效率极低,转换应该花费很长时间来处理大型数据集。 具体来说,如果您的数据集包含具有150k功能的20M样本,则密集表示将不适合您的内存,甚至可能不适合您的磁盘。