2017-06-10 66 views
2

大きなパンダのデータフレームにカテゴリデータ("Yes"と)を含むいくつかの列をエンコードしようとしています。完全なデータフレームには400以上のカラムが含まれていますので、必要なすべてのカラムを1つずつエンコードせずにエンコードする方法を探します。私はScikit-LabelEncoderを使用して、カテゴリデータをエンコードします。Sklearnラベル複数の列をエンコードするpandas dataframe

データフレームの最初の部分はエンコードする必要はありませんが、分割しないで直接データを含む目的の列をすべてエンコードし、データフレームを連結する方法を探しています。

私の質問を示すために、私はまずデータフレームの小さな部分でそれを解決しようとしました。しかし、データがフィットし変換された最後の部分にこだわって、ValueError: bad input shape (4,3)を得る。コード私が走ったよう:

# Create a simple dataframe resembling large dataframe 
    data = pd.DataFrame({'A': [1, 2, 3, 4], 
         'B': ["Yes", "No", "Yes", "Yes"], 
         'C': ["Yes", "No", "No", "Yes"], 
         'D': ["No", "Yes", "No", "Yes"]}) 


# Import required module 
from sklearn.preprocessing import LabelEncoder 

# Create an object of the label encoder class 
labelencoder = LabelEncoder() 

# Apply labelencoder object on columns 
labelencoder.fit_transform(data.ix[:, 1:]) # First column does not need to be encoded 

を完全なエラーレポート:

labelencoder.fit_transform(data.ix[:, 1:]) 
Traceback (most recent call last): 

    File "<ipython-input-47-b4986a719976>", line 1, in <module> 
    labelencoder.fit_transform(data.ix[:, 1:]) 

    File "C:\Anaconda\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 129, in fit_transform 
    y = column_or_1d(y, warn=True) 

    File "C:\Anaconda\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 562, in column_or_1d 
    raise ValueError("bad input shape {0}".format(shape)) 

ValueError: bad input shape (4, 3) 

誰もがこれを行う方法を知っていますか?

+1

ラベルエンコーダは、単一の列をサポートしています。列を反復してエンコードする必要があります。 –

+0

ありがとう!私はこれを見て、投稿にフォローアップを書いてください – HelloBlob

答えて

1

次のコードでは、DataFrameにLabelEncoderを適用して複数の列をエンコードできます。ただし、すべての列のクラス情報は取得できません。

import pandas as pd 
from sklearn.preprocessing import LabelEncoder 

df = pd.DataFrame({'A': [1, 2, 3, 4], 
        'B': ["Yes", "No", "Yes", "Yes"], 
        'C': ["Yes", "No", "No", "Yes"], 
        'D': ["No", "Yes", "No", "Yes"]}) 
print(df) 
# A B C D 
# 0 1 Yes Yes No 
# 1 2 No No Yes 
# 2 3 Yes No No 
# 3 4 Yes Yes Yes 

# LabelEncoder 
le = LabelEncoder() 

# apply "le.fit_transform" 
df_encoded = df.apply(le.fit_transform) 
print(df_encoded) 
# A B C D 
# 0 0 1 1 0 
# 1 1 0 0 1 
# 2 2 1 0 0 
# 3 3 1 1 1 

# Note: we cannot obtain the classes information for all columns. 
print(le.classes_) 
# ['No' 'Yes'] 
+0

なぜこれはdownvotedされていますか?それは私のために働く... – mic

0
import pandas as pd 
from sklearn.base import BaseEstimator, TransformerMixin 
from sklearn.preprocessing import LabelBinarizer 
# df is the pandas dataframe 
class preprocessing (BaseEstimator, TransformerMixin): 
     def __init__ (self, df): 
     self.datatypes = df.dtypes.astype(str) 
     self.catcolumns = [] 
     self.cat_encoders = [] 
     self.encoded_df = [] 

     def fit (self, df, y = None): 
      for ix, val in zip(self.datatypes.index.values, 
      self.datatypes.values): 
       if val =='object': 
       self.catcolumns.append(ix) 
      fit_objs = [str(i) for i in range(len(self.catcolumns))] 
      for encs, name in zip(fit_objs,self.catcolumns): 
       encs = LabelBinarizer() 
       encs.fit(df[name]) 
       self.cat_encoders.append((name, encs)) 
      return self 
     def transform (self, df , y = None): 
      for name, encs in self.cat_encoders: 
       df_c = encs.transform(df[name]) 
       self.encoded_df.append(pd.DataFrame(df_c)) 
      self.encoded_df = pd.concat(self.encoded_df, axis = 1, 
      ignore_index 
      = True) 
      self.df_num = df.drop(self.catcolumns, axis = 1) 
      y = pd.concat([self.df_num, self.encoded_df], axis = 1, 
      ignore_index = True) 
      return y   
# use return y.values to use in sci-kit learn pipeline 
""" Finds categorical columns in a dataframe and one hot encodes the 
    columns. you can replace labelbinarizer with labelencoder if you 
    require only label encoding. Function returns encoded categorcial data 
    and numerical data as a dataframe """ 
+5

"コードのみ"の答えを与えるのではなく、代わりにあなたの変更/方法とOPの問題を解決する方法を説明してください。 – GPhilo

+0

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](レビュー/低品質の投稿/ 18599806) – Ron

+0

説明を含めるにはどうすればいいですか?私はインターフェイスを理解していないようです – Tobi

関連する問題