如何为Sci-kit Learn重新格式化分类Pandas变量

时间:2015-03-26 20:19:16

标签: python pandas scikit-learn

给出一个看起来像这样的pandas dataFrame:

|       | c_0337 | c_0348 | c_0351 | c_0364 |
|-------|:------:|-------:|--------|--------|
| id    |        |        |        |        |
| 11193 |    a   |      f | o      | a      |
| 11382 |    a   |      k | s      | a      |
| 16531 |    b   |      p | f      | b      |
| 1896  |    a   |      f | o      | NaN    |

我正在尝试将分类变量转换为数字(最好是二进制真假列)我尝试使用scikit中的OneHotEncoder学习 如下:

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([c4k.ix[:,'c_0327':'c_0351'].values])  
OneHotEncoder(categorical_features='all',
   n_values='auto', sparse=True) 

那只是给了我:基数为10的long()的文字无效:' f'

我需要将数据放入Scikit学习可接受的数组中,对于包含相应字母的已创建列,大多数条目(例如非常稀疏)的列创建为false?

NaN为0 =假

我怀疑我离开这里了?就像没有使用正确的预处理器一样?

这是全新的,所以任何指针都赞赏实际的数据集有超过1000个这样的列...... 所以我尝试使用DictVectorizer如下:

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer() 
#fill df with zeros Since we don't want NaN
c4kNZ=c4k.ix[:,'c_0327':'c_0351'].fillna(0) 
#Make the dataFrame a Dict 
c4kb=c4kNZ.to_dict() 
sdata = vec.fit_transform(c4kb) 

它给了我float()参数必须是一个字符串或一个数字 - 我重新检查了字典,它看起来不错,但我想我还没有正确格式化它?

1 个答案:

答案 0 :(得分:4)

这是你要找的吗?
它使用get_dummies将分类列转换为稀疏虚拟列,指示存在值:

In [12]: df = pd.DataFrame({'c_0337':list('aaba'), 'c_0348':list('fkpf')})

In [13]: df
Out[13]:
  c_0337 c_0348
0      a      f
1      a      k
2      b      p
3      a      f

In [14]: pd.get_dummies(df)
Out[14]:
   c_0337_a  c_0337_b  c_0348_f  c_0348_k  c_0348_p
0         1         0         1         0         0
1         1         0         0         1         0
2         0         1         0         0         1
3         1         0         1         0         0