python - 将带有分类值的 pandas 数据帧转换为二进制值

标签 python pandas scikit-learn

我正在尝试将分类数据转换为二进制数据,以便能够使用逻辑回归等算法进行分类。我想过使用“sklearn.preprocessing”模块中的 OneHotEncoder,但问题是数据帧条目是 A、B 对长度不同的数组,每行都有一对相同长度的数组,不等于数组其他行的长度。 OneHotEncoder 不接受像我这样的数据帧

In [34]: data.index

Out[34]: Index([train1, train2, train3, ..., train7829, train7830, train7831], dtype=object)

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)

然后我想将每对数组组合成两行矩阵,以便我可以将其传递给编码器,然后在编码后再次将它们分开,如下所示:

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)

完成所有这些步骤后,得到一个稀疏数据帧。我的问题是:

  1. 这是编码此数据帧的正确方法吗?(我非常怀疑)
  2. 如果没有,那么你们提供哪些替代方案?
    非常感谢您花时间帮助我。

最佳答案

这是将数据转换为更好的表示以进行处理的好方法;使用一些 巧妙运用技巧

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

关于python - 将带有分类值的 pandas 数据帧转换为二进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17349981/

相关文章:

python - Pandas :更改列数据类型会产生警告

python - Pyqt5 鼠标事件不适用于我的自定义选项卡栏

python - 如何在 Windows 上安装 Oauth2 安装(多个错误)

python - 使用 python requests 和 BeatifulSoup 在维基百科页面上抓取多个表及其标题?

python - 如何使用 Python 根据另一个 DataFrame 中的行选择 DataFrame 中的行

python-3.x - 多项式朴素贝叶斯 softmax 改变

python - 将多个项目放入 python 队列中

python - 为 Pandas 多索引数据框中的行子集设置不同的列

python - 如何使用Python的FastFM库(分解机)做推荐任务?

machine-learning - 文本数据上的 MiniBatchSparsePCA