我正在尝试将分类数据转换为二进制数据,以便能够使用逻辑回归之类的算法进行分类。我曾想过使用"sklearn.processing"模块中的OneHotEncoder,但问题是数据帧条目是A、B对长度不同的数组,每行都有一对相同长度的数组,与其他行中的数组长度不相等。OneHotEncoder不接受类似我的的数据帧
在[34]中:data.index
输出[34]:索引([train1,train2,train3,…,train7829,train7830,train7831],dtype=对象)
In [35]: data.columns
Out[35]: Index([A, B], dtype=object)
SampleID A B
train1 [2092.0, 1143.0, 390.0, ...] [5651.0, 4449.0, 4012.0...]
train2 [3158.0, 3158.0, 3684.0, 3684.0....] [2.0, 4.0, 2.0, 1.0...]
train3 [1699.0, 1808.0 ,...] [0.0, 1.0...]
所以,我想再次强调,每个A和B对都有相同的长度,但不同对的长度是可变的。数据框包含数值、分类值和二进制值。我有另一个csv文件,里面有关于每个条目类型的信息。我阅读了这个文件,过滤掉了两列中的分类条目,如下所示:
info=data_io.read_train_info()
col1=info.columns[0]
col2=info.columns[1]
info=info[(info[col1]=='Categorical')&(info[col2]=='Categorical')]
然后我使用info.index
来过滤我的训练数据帧
filtered = data.loc[info.index]
然后我写了一个实用函数来改变每个阵列的尺寸,这样我以后就可以对它们进行编码
def setDim(df):
for item in x[x.columns[0]].index:
df[df.columns[0]][item].shape=(1,df[df.columns[0]][item].shape[0])
df[df.columns[1]][item].shape=(1,df[df.columns[1]][item].shape[0])
setDim(filtered)
然后我想把每对数组组合成2行矩阵,这样我就可以把它传给编码器,然后在编码后再次分离它们,就像这样:
import numpy as np
from sklearn.preprocessing import OneHotEncoder
def makeSparse(df):
enc = OneHotEncoder()
for i in df.index:
cd=np.append(df['A'][i],df['B'][i],axis=0)
a=enc.fit_transform(cd)
df['A'][i] = a[0,:]
df['B'][i] = a[1,:]
makeSparse(filtered)
在所有这些步骤之后,得到一个稀疏的数据帧。我的问题是:
- 这是对数据帧进行编码的正确方法吗?(我对此深表怀疑)
- 如果没有,那么你提供什么替代方案?
非常感谢您花时间帮助我
这是将数据转换为更好的repr的好方法;使用一些巧妙的应用技巧
In [72]: df
Out[72]:
A B
train1 [2092, 1143, 390] [5651, 449, 4012]
train2 [3158, 3158, 3684, 3684] [2, 4, 2, 1]
train3 [1699, 1808] [0, 1]
In [73]: concat(dict([ (x[0],x[1].apply(lambda y: Series(y))) for x in df.iterrows() ]))
Out[73]:
0 1 2 3
train1 A 2092 1143 390 NaN
B 5651 449 4012 NaN
train2 A 3158 3158 3684 3684
B 2 4 2 1
train3 A 1699 1808 NaN NaN
B 0 1 NaN NaN
大约9年后,当从Pandas官方文档(即烹饪书)重定向到这个线程时,我从投票最多的答案中提出了一个可能更整洁的转换实现。
从此开始:
A B
train1 [2092, 1143, 390] [5651, 449, 4012]
train2 [3158, 3158, 3684, 3684] [2, 4, 2, 1]
train3 [1699, 1808] [0, 1]
对此:
0 1 2 3
train1 A 2092.0 1143.0 390.0 NaN
B 5651.0 449.0 4012.0 NaN
train2 A 3158.0 3158.0 3684.0 3684.0
B 2.0 4.0 2.0 1.0
train3 A 1699.0 1808.0 NaN NaN
B 0.0 1.0 NaN NaN
可以简单地使用:
df.transpose().unstack().apply(pd.Series)