これは、3列3行のデータセットです
名前組織部門
マニーABC2ファイナンス
ジョイスABC1 HR
AMI NSV2 HR
これは私が持っているコードです:
ここまでは問題ありませんが、それぞれの最初のダミー変数列を削除するにはどうすればよいですか?
# 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)
テスト:
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:]
のエラーに関する更新:
ドキュメントページ ごとに、columns
パラメーターは「列名」を取ります。したがって、次のコードが機能します。
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)
0.21から始まるscikit-learnバージョンでは非常に簡単です。 OneHotEncoderのドロップパラメーターを使用し、それを使用して機能ごとにカテゴリーの1つをドロップできます。デフォルトでは、ドロップされません。詳細はドキュメントに記載されています。
//drops the first category in each feature
ohe = OneHotEncoder(drop='first', handle_unknown='error')
カテゴリ変数を一度に1つずつエンコードします。ダミー変数は、データセットの開始インデックスに移動する必要があります。次に、次のように最初の列を切り取ります。
X = X[:, 1:]
次に、次の変数をエンコードして繰り返します。
そのために独自のテンプレートを使用します。
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
そして、このコードを使用するために、このテンプレートを現在のディレクトリにファイル名で置くだけで、CustomeEncoder.pyを想定してコードを入力してみましょう:
from customEncoder import DataFrameEncoder
data = DataFrameEncoder().fit_transormer(data)
そして、すべてのオブジェクトタイプデータが削除され、エンコードされ、最初に削除され、結合されて最終的な目的の出力が得られます。
PS:このテンプレートへの入力ファイルはPandas Dataframeです。