パンダ:カテゴリを数字に変換する


86

次のような国のデータフレームがあるとします。

cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0

国を「ワンホットエンコーディング」に変換するpd.get_dummies関数があることを私は知っています。ただし、代わりに取得できるように、代わりにインデックスに変換したいと思いcc_index = [1,2,1,3]ます。

以下に示すように、get_dummiesをnumpywhere句と一緒に使用するよりも高速な方法があると思います。

[np.where(x) for x in df.cc.get_dummies().values]

これは、Rで「factors」を使用して行う方がやや簡単なので、パンダにも同様の機能があることを期待しています。


2
どういう意味cc_index = [0,1,0,2]ですか?
juanpa.arrivillaga 2016年

1
確かに、python 0インデックスを忘れてしまった
sachinruk 2016年

DataFrameのカテゴリシリーズまたは列が役立つ場合があります。
min2bro 2016年

回答:


150

まず、列のタイプを変更します。

df.cc = pd.Categorical(df.cc)

これで、データは似ていますが、カテゴリ別に保存されます。カテゴリコードを取得するには:

df['code'] = df.cc.cat.codes

今あなたは持っています:

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

DataFrameを変更せずに、単にコードを取得する場合:

df.cc.astype('category').cat.codes

または、カテゴリ列をインデックスとして使用します。

df2 = pd.DataFrame(df.temp)
df2.index = pd.CategoricalIndex(df.cc)

5
呼び出しdf.cc.cat.codesがちょうどに変わったようdf.cc.codesです?
Andreas StorvikStrauman20年

1
欠落している値がある場合、それらは-1にエンコードされることに注意してください。このケースの処理を避けたい場合は、最初に文字列にキャストできます:df.cc.astype( 'str')。astype( 'category')。cat.codes
Guy s

それは次のように変化するNaNよう-1です?
ahbon

25

級数を整数識別子に変換するだけの場合は、を使用できますpd.factorize

このソリューションは、とは異なりpd.Categorical、アルファベット順に並べ替えられないことに注意してください。したがって、最初の国が割り当てられ0ます。から開始する1場合は、定数を追加できます。

df['code'] = pd.factorize(df['cc'])[0] + 1

print(df)

   cc  temp  code
0  US  37.0     1
1  CA  12.0     2
2  US  35.0     1
3  AU  20.0     3

アルファベット順に並べ替える場合は、次のように指定しますsort=True

df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1 

14

sklearnライブラリを使用している場合は、を使用できますLabelEncoder。と同様にpd.Categorical、入力文字列はエンコード前にアルファベット順にソートされます。

from sklearn.preprocessing import LabelEncoder

LE = LabelEncoder()
df['code'] = LE.fit_transform(df['cc'])

print(df)

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

2

これを試して、頻度に基づいて数値に変換してください(高周波-高周波):

labels = df[col].value_counts(ascending=True).index.tolist()
codes = range(1,len(labels)+1)
df[col].replace(labels,codes,inplace=True)

1

列を数値に変更します。新しい列は作成されませんが、値が数値データに置き換えられるだけです。

def characters_to_numb(*args): for arg in args: df[arg] = pd.Categorical(df[arg]) df[arg] = df[arg].cat.codes return df


0

1行のコード:

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes)

これは、list_of_columns次の場合にも機能します。

df[list_of_columns] = df[list_of_columns].apply(lambda col:pd.Categorical(col).codes)

さらに、NaN値を保持したい場合は、置換を適用できます。

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes).replace(-1,np.nan)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.