如何将OneHotEncoder用于多列并自动删除每列的第一个虚拟变量?

时间:2017-06-17 06:29:17

标签: python pandas machine-learning scikit-learn

这是包含3个cols和3行

的数据集
  

名称组织部门

     

Manie ABC2 FINANCE

     

Joyce ABC1 HR

     

Ami NSV2 HR

这是我的代码:

现在好了,直到这里,我如何删除每个的第一个虚拟变量列?

static List<Pair> solve(List<Pair> lunchMenuPairs, List<Pair> teamCuisinePreferencePairs){
    List<Pair> result= new ArrayList<>();
    ...

7 个答案:

答案 0 :(得分:7)

import pandas as pd
df = pd.DataFrame({'name': ['Manie', 'Joyce', 'Ami'],
                   'Org':  ['ABC2', 'ABC1', 'NSV2'],
                   'Dept': ['Finance', 'HR', 'HR']        
        })


df_2 = pd.get_dummies(df,drop_first=True)

试验:

print(df_2)
   Dept_HR  Org_ABC2  Org_NSV2  name_Joyce  name_Manie
0        0         1         0           0           1
1        1         0         0           1           0
2        1         0         1           0           0 

使用pd.get_dummies(X, columns =[1:]更新您的错误:

根据documentation pagecolumns参数采用&#34;列名称&#34;。所以下面的代码可以工作:

df_2 = pd.get_dummies(df, columns=['Org', 'Dept'], drop_first=True)

输出:

    name  Org_ABC2  Org_NSV2  Dept_HR
0  Manie         1         0        0
1  Joyce         0         0        1
2    Ami         0         1        1

如果你真的想要定位你的列,你可以这样做:

column_names_for_onehot = df.columns[1:]
df_2 = pd.get_dummies(df, columns=column_names_for_onehot, drop_first=True)

答案 1 :(得分:1)

我使用自己的模板来做到这一点:

kh3m@kh3m-machine:~/Research/JavaScriptCore/WebKit$
>
sudo ./Tools/Scripts/build-webkit --jsc-only --debug 
[sudo] password for kh3m: 
+  cmake -DPORT="JSCOnly" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DENABLE_SANITIZERS=address -G Ninja -DDEVELOPER_MODE=ON -DENABLE_EXPERIMENTAL_FEATURES=ON "/home/kh3m/Research/JavaScriptCore/WebKit"

要使用此代码,只需将此模板和文件名放在当前目录中,让我们假设CustomeEncoder.py并输入您的代码:

from sklearn.base import TransformerMixin
import pandas as pd
import numpy as np
class DataFrameEncoder(TransformerMixin):

    def __init__(self):
        """Encode the data.

        Columns of data type object are appended in the list. After 
        appending Each Column of type object are taken dummies and 
        successively removed and two Dataframes are concated again.

        """
    def fit(self, X, y=None):
        self.object_col = []
        for col in X.columns:
            if(X[col].dtype == np.dtype('O')):
                self.object_col.append(col)
        return self

    def transform(self, X, y=None):
        dummy_df = pd.get_dummies(X[self.object_col],drop_first=True)
        X = X.drop(X[self.object_col],axis=1)
        X = pd.concat([dummy_df,X],axis=1)
        return X

然后将所有对象类型数据删除,编码,先删除并合并在一起,以提供最终所需的输出。
PS:该模板的输入文件是Pandas Dataframe。

答案 2 :(得分:1)

在scikit-learn版本中,从0.21开始非常简单。可以使用OneHotEncoder中的drop参数,并使用它为每个功能删除一个类别。默认情况下,它不会删除。详细信息可以在文档中找到。

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing.OneHotEncoder

$ cat replace.sh 
#!/bin/bash

for i in `egrep -o \'[0-9]+\' a.txt`;do
    sed -i "s/$i/${i:1:${#i}-2}/g" a.txt
done;

答案 3 :(得分:0)

一次编码一个分类变量。虚拟变量应该转到数据集的起始索引。然后,就像这样切断第一列:

X = X[:, 1:]

然后编码并重复下一个变量。

答案 4 :(得分:0)

使用ColumnTransformer可以仅将OneHotEncoder应用于某些列。 为分类和数字变量创建一个单独的管道,并应用ColumnTransformer。可以在ColumnTransformer上找到有关它的更多信息。

here提供了另一个很好的实现示例。

答案 5 :(得分:0)

我使用自己的模块来处理一种热编码。

false

使用非常简单

const empty = Object.keys(theObject).length === 0 || Object.values(theObject).filter(value => {
  return value.trim() === '';
}).length > 0;

它返回带有列名的数据框。因此,涵盖了OneHotEncoder和pd.get_dummies()的缺点。 因此,我们可以像OneHotEncoder一样使用它进行拟合和转换,它还可以为我们保存列名并返回类似傻瓜方法的数据帧。

答案 6 :(得分:-2)

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for i in range(Y.shape[1]):
    Y[:,i] = le.fit_transform(Y[:,i])