结合pandas group_by和sklearn countVectorizer

时间:2015-11-06 07:28:31

标签: python pandas group-by scikit-learn classification

我有一个格式为的数据框:

ID    col1  col2  col3   class
1     0.35  "A"    "x"  'class1'
1     0.35  "B"    "y"  'class1'
1     0.35  "A"    "x"  'class1'
1     0.35  "A"    "z"  'class1'
2     0.48  "B"    "u"  'class2'
2     0.48  "A"    "x"  'class2'
3     0.14  "C"    "v"  'class3'

其中col2和col3的尺寸非常高(总共超过7000)。我必须对ID字段进行分类。所以在我的理解中,我需要对数据进行分组。如果我使用pandas group_by并使用密集格式,则内存会爆炸。所以我想知道将数据输入分类器的最佳方法是什么?无论如何,我可以根据col2和col3的计数对数据进行分组,同时保持col1不变并将输出放在稀疏矩阵中?

1 个答案:

答案 0 :(得分:1)

如果我理解您的要求,我会通过分隔groupby和功能选择来实现此目的,以便groupby只聚合字符串,而CountVectorizer是应用于这些分组的字符串。例如:

>>> grouped = df.groupby('ID').aggregate({'col1':'first',
                                          'col2':'sum',
                                          'col3':'sum'})
>>> grouped['all'] = grouped['col2'] + grouped['col3']
>>> print(grouped)
    col3  col1  col2       all
ID                            
1   xyxz  0.35  ABAA  ABAAxyxz
2     ux  0.48    BA      BAux
3      v  0.14     C        Cv

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> features = CountVectorizer(analyzer='char').fit_transform(grouped['all'])
>>> features.shape
(3, 8)

这应适当缩放到大量列。如果你需要计算单词而不是字符,上面的解决方案只需要稍作修改。