Ceci est l'ensemble de données avec 3 colonnes et 3 lignes
Nom Organisation Département
Manie ABC2 FINANCE
Joyce ABC1 HR
AMI NSV2 HR
Voici le code que j'ai:
Maintenant, tout va bien jusqu'ici, comment puis-je supprimer la première colonne variable factice pour chacun?
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('Data1.csv',encoding = "cp1252")
X = dataset.values
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_0 = LabelEncoder()
X[:, 0] = labelencoder_X_0.fit_transform(X[:, 0])
labelencoder_X_1 = LabelEncoder()
X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
labelencoder_X_2 = LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
onehotencoder = OneHotEncoder(categorical_features = "all")
X = onehotencoder.fit_transform(X).toarray()
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)
tester:
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
MISE À JOUR concernant votre erreur avec pd.get_dummies(X, columns =[1:]
:
D'après la page de documentation , le paramètre columns
prend "Column Names". Ainsi, le code suivant fonctionnerait:
df_2 = pd.get_dummies(df, columns=['Org', 'Dept'], drop_first=True)
production:
name Org_ABC2 Org_NSV2 Dept_HR
0 Manie 1 0 0
1 Joyce 0 0 1
2 AMI 0 1 1
Si vous voulez vraiment définir vos colonnes de manière positionnelle, vous pouvez le faire de cette façon:
column_names_for_onehot = df.columns[1:]
df_2 = pd.get_dummies(df, columns=column_names_for_onehot, drop_first=True)
C'est assez simple dans la version scikit-learn à partir de 0.21. On peut utiliser le paramètre drop dans OneHotEncoder et l'utiliser pour supprimer l'une des catégories par fonctionnalité. Par défaut, il ne tombera pas. Les détails peuvent être trouvés dans la documentation.
//drops the first category in each feature
ohe = OneHotEncoder(drop='first', handle_unknown='error')
Encodez les variables catégorielles une par une. Les variables factices doivent aller à l'index de début de votre ensemble de données. Ensuite, coupez simplement la première colonne comme ceci:
X = X[:, 1:]
Ensuite, encodez et répétez la variable suivante.
J'utilise mon propre modèle pour cela:
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
Et pour utiliser ce code, mettez simplement ce modèle dans le répertoire courant avec le nom de fichier supposons CustomeEncoder.py et tapez votre code:
from customEncoder import DataFrameEncoder
data = DataFrameEncoder().fit_transormer(data)
Et toutes les données de type d'objet supprimées, encodées, supprimées en premier et réunies pour donner la sortie finale souhaitée.
PS: Que le fichier d'entrée de ce modèle est Pandas Dataframe.