次のコードを使用して、データセット内の文字列をカテゴリ値に変換しています。
data['weekday'] = pd.Categorical.from_array(data.weekday).labels
たとえば、
index weekday
0 Sunday
1 Sunday
2 Wednesday
3 Monday
4 Monday
5 Thursday
6 Tuesday
曜日をエンコードした後、私のデータセットは次のように表示されます。
index weekday
0 3
1 3
2 6
3 1
4 1
5 4
6 5
日曜日が3、水曜日から6などにマッピングされていることを知る方法はありますか?
これを行う最良の方法は、sklearnライブラリのラベルエンコーダを使用することです。
このようなもの:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
list(le.classes_)
le.transform(["tokyo", "tokyo", "paris"])
list(le.inverse_transform([2, 2, 1]))
マッピングを使用して追加の辞書を作成できます。
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(data['name'])
le_name_mapping = dict(Zip(le.classes_, le.transform(le.classes_)))
print(le_name_mapping)
{'Tom': 0, 'Nick': 1, 'Kate': 2}
同じことをするシンプルでエレガントな方法。
cat_list = ['Sun', 'Sun', 'Wed', 'Mon', 'Mon']
encoded_data, mapping_index = pd.Series(cat_list).factorize()
あなたは完了で、以下を確認してください
print(encoded_data)
print(mapping_index)
print(mapping_index.get_loc("Mon"))
これを行うには多くの方法があります。 pd.factorize
、sklearn.preprocessing.LabelEncoder
など。ただし、この特定のケースでは、最適な2つのオプションがあります。
独自の方法で、カテゴリを追加できます:
pd.Categorical( df.weekday, [
'Sunday', 'Monday', 'Tuesday',
'Wednesday', 'Thursday', 'Friday',
'Saturday'] ).labels
他のオプションは、dict
を使用して値を直接マッピングすることです
df.weekday.map({
'Sunday': 0,
'Monday': 1,
# ... and so on. You get the idea ...
})
まず、カテゴリシリーズを作成します。
weekdays = pd.Series(['Sun', 'Sun', 'Wed', 'Mon', 'Mon']).astype('category')
次に、その「カテゴリ」を調べます。
weekdays.cat.categories.get_loc('Sun')
データフレームに数値とカテゴリの両方のタイプのデータがある場合、使用できます:ここで、Xはカテゴリと数値の両方の変数を持つ私のデータフレームです
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
for i in range(0,X.shape[1]):
if X.dtypes[i]=='object':
X[X.columns[i]] = le.fit_transform(X[X.columns[i]])
または、これを試すことができます:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data = data.apply(le.fit_transform)
注:この手法は、元に戻すことに興味がない場合に適しています。