如何为 Scikit Learn 重新格式化分类 Pandas 变量
How to reformat categorical Pandas variables for Sci-kit 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 对于包含相应字母的创建列为 true?
NaN 为 0=false
我怀疑我跑题了?甚至没有使用正确的预处理器?
这是全新的所以任何指针都赞赏实际数据集有超过 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() 参数必须是一个字符串或一个数字——我重新检查了字典,它看起来没问题,但我想我没有把它格式化正确?
这是您要找的吗?
它使用 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
给定一个 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 对于包含相应字母的创建列为 true?
NaN 为 0=false
我怀疑我跑题了?甚至没有使用正确的预处理器?
这是全新的所以任何指针都赞赏实际数据集有超过 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() 参数必须是一个字符串或一个数字——我重新检查了字典,它看起来没问题,但我想我没有把它格式化正确?
这是您要找的吗?
它使用 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