2016-10-07 9 views
0

いくつかの列がエンコーディングを必要としないところで、パンダのデータフレームをsklearn one-hot-encoded(dataframe/numpy配列)に変換するにはどうすればよいですか?パンダsklearnワンホットエンコードデータフレームまたはnumpy?

mydf = pd.DataFrame({'Target':[0,1,0,0,1, 1,1], 
        'GroupFoo':[1,1,2,2,3,1,2], 
        'GroupBar':[2,1,1,0,3,1,2], 
        'GroupBar2':[2,1,1,0,3,1,2], 
        'SomeOtherShouldBeUnaffected':[2,1,1,0,3,1,2]}) 
columnsToEncode = ['GroupFoo', 'GroupBar'] 

は、既に符号化されたデータフレームにラベルを付け、私はcolumnsToEncodeでマークされた列をエンコードしたいと思いますか?

私の問題は、pd.Dataframeまたはnumpyの配列表現が優れているかどうかと、エンコードされた部分をもう一方と再マージする方法がわかりません。

私の試みこれまで:

myEncoder = OneHotEncoder(sparse=False, handle_unknown='ignore') 
myEncoder.fit(X_train) 
df = pd.concat([ 
     df[~columnsToEncode], # select all other/numeric 
     # select category to one-hot encode 
     pd.Dataframe(encoder.transform(X_train[columnsToEncode]))#.toarray() # not sure what this is for 
     ], axis=1).reindex_axis(X_train.columns, axis=1) 

お知らせ:私はPandas: Get Dummies/http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.htmlの承知していますが、それは私が倍にあたり、このようなエンコーディングを必要と電車/テスト・スプリットでうまく再生できません。

+0

を行うためにも、優れているに使用しているときpre-one.hotエンコーディングが問題である理由を、このアップデートは、それは私には全く明らかではないと信じていますtrain/test split(両方のセットがおそらくこのエンコーディングを必要とするので、分割する前にそれを行うだけです)。本当に必要な場合は、おそらくscikit-learnのパイプライン(前処理は自動的にクラシファイア/回帰分析に渡される前に呼び出されます)で行うことができます。また、常にdf.as_matrix()を使用してnumpy配列を抽出することができます。 – sascha

+0

明日のフィーチャーユニオンを試してみる必要があります。要点は、折りたたみごとに一定の前処理ステップを実行する必要があることです。 –

答えて

1

このライブラリは、今私は

myEncoder = OneHotEncoder(sparse=False, handle_unknown='ignore') 
myEncoder.fit(df[columnsToEncode]) 

pd.concat([df.drop(columnsToEncode, 1), 
      pd.DataFrame(myEncoder.transform(df[columnsToEncode]))], axis=1).reindex() 
を使用するためしかし、彼らはまだ

を「未知のカテゴリを扱う」をサポートしていませんパンダhttps://github.com/wdm0006/categorical_encoding

とうまくsklearn/numpyのプレーをするいくつかのカテゴリエンコーダを提供

これは未知のデータセットをサポートしています。今のところ、私はパンダの素敵なラベルのために、半分のパンダを半分にすることに固執します。数値列の場合

0

私は最初の答えはtはダミーコーディング インポートログ

import pandas as pd 
from sklearn.base import TransformerMixin 

log = logging.getLogger(__name__) 


class CategoricalDummyCoder(TransformerMixin): 
    """Identifies categorical columns by dtype of object and dummy codes them. Optionally a pandas.DataFrame 
    can be returned where categories are of pandas.Category dtype and not binarized for better coding strategies 
    than dummy coding.""" 

    def __init__(self, only_categoricals=False): 
     self.categorical_variables = [] 
     self.categories_per_column = {} 
     self.only_categoricals = only_categoricals 

    def fit(self, X, y): 
     self.categorical_variables = list(X.select_dtypes(include=['object']).columns) 
     logging.debug(f'identified the following categorical variables: {self.categorical_variables}') 

     for col in self.categorical_variables: 
      self.categories_per_column[col] = X[col].astype('category').cat.categories 
     logging.debug('fitted categories') 
     return self 

    def transform(self, X): 
     for col in self.categorical_variables: 
      logging.debug(f'transforming cat col: {col}') 
      X[col] = pd.Categorical(X[col], categories=self.categories_per_column[col]) 
      if self.only_categoricals: 
       X[col] = X[col].cat.codes 
     if not self.only_categoricals: 
      return pd.get_dummies(X, sparse=True) 
     else: 
      return X 
関連する問題