Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将具有分类值的数据帧转换为二进制值_Python_Pandas_Scikit Learn - Fatal编程技术网

Python 将具有分类值的数据帧转换为二进制值

Python 将具有分类值的数据帧转换为二进制值,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,我正在尝试将分类数据转换为二进制数据,以便能够使用逻辑回归之类的算法进行分类。我曾想过使用“sklearn.preprocessing”模块中的OneHotEncoder,但问题是数据帧条目是A、B对长度不同的数组,每行都有一对长度相同的数组,而不是其他行中的数组长度。 OneHotEncoder不接受像我这样的数据帧 In[34]:data.index Out[34]:索引([train1,train2,train3,…,train7829,train7830, 列车7831],数据类型=对象

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

In[34]:data.index

Out[34]:索引([train1,train2,train3,…,train7829,train7830, 列车7831],数据类型=对象)

所以,我想再次强调,每个A和B对都有相同的长度,但长度在不同的对之间是可变的。Dataframe包含数字、分类和二进制值。 我有另一个csv文件,其中包含关于每个条目类型的信息。我在两列中读取文件筛选出分类条目,如下所示:

info=data_io.read_train_info()
col1=info.columns[0]
col2=info.columns[1]
info=info[(info[col1]=='Categorical')&(info[col2]=='Categorical')]
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)
然后我使用
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)
然后我想把每一对数组组合成两行矩阵,这样我就可以将它传递给编码器,然后在编码后再次将它们分开,如下所示:

info=data_io.read_train_info()
col1=info.columns[0]
col2=info.columns[1]
info=info[(info[col1]=='Categorical')&(info[col2]=='Categorical')]
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
    

    这是一种很好的方法,可以将数据转换为更好的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
    

    (1)的答案很大程度上取决于行实际代表的内容。在任何情况下,scikit学习约定是一列代表一个特性,每个特性必须出现在每个示例中。我明白了,让我详细说明一下。每对A和B向量具有相同数量的特征,但在其他向量对中它们不相同。每行都有不同的功能。因此,如果各行的功能不相同,则无法应用编码,对吗?如果您想从数据中学习,则需要在整个集合中使用一致的功能。您必须“填充”(插补)其他特征,但列必须一致。@larsmans我的数据框包含来自不同类型实验的观察结果。这是一种因果关系,一列是因果关系,另一列是因果关系,反之亦然。如何处理这种异构数据集?在下面Jeff建议的转换之后可以应用编码吗?对不起,这还是太模糊了。我可以猜测一下:每一行是否都是一组整数,表示某个事件发生了,而所有未列出的事件都没有发生?对(1)的回答很大程度上取决于行实际代表的内容。在任何情况下,scikit学习约定是一列代表一个特性,每个特性必须出现在每个示例中。我明白了,让我详细说明一下。每对A和B向量具有相同数量的特征,但在其他向量对中它们不相同。每行都有不同的功能。因此,如果各行的功能不相同,则无法应用编码,对吗?如果您想从数据中学习,则需要在整个集合中使用一致的功能。您必须“填充”(插补)其他特征,但列必须一致。@larsmans我的数据框包含来自不同类型实验的观察结果。这是一种因果关系,一列是因果关系,另一列是因果关系,反之亦然。如何处理这种异构数据集?在下面Jeff建议的转换之后可以应用编码吗?对不起,这还是太模糊了。我可以猜一猜:每一行是否都是一组整数,表示某个事件发生了,而所有未列出的事件都没有发生?这真是太好了,谢谢!问题仍然存在:OneHotEncoder可以应用于这个转换后的数据帧吗?这真是太好了,谢谢!问题仍然存在:OneHotEncoder可以应用于这个转换后的数据帧吗?