web-dev-qa-db-ja.com

Pandasデータフレーム列を1つのホットラベルに変換する

私はこれに似たpandasデータフレームを持っています:

_  Col1   ABC
0  XYZ    A
1  XYZ    B
2  XYZ    C
_

列ABCでpandas get_dummies()関数を使用すると、次のようになります。

_  Col1   A   B   C
0  XYZ   1   0   0
1  XYZ   0   1   0
2  XYZ   0   0   1
_

ABC列のデータ型が_list / array_の場合、次のようなものが必要です。

_  Col1    ABC
0  XYZ    [1,0,0]
1  XYZ    [0,1,0]
2  XYZ    [0,0,1]
_

_get_dummies_関数を使用して、すべての列を目的の列に結合してみました。次のように、複数の列を文字列として組み合わせる方法を説明する多くの回答を見つけました: pandas/pythonのデータフレームで2列のテキストを組み合わせる 。しかし、それらをリストとして組み合わせる方法がわかりません。

この質問では、sklearnのOneHotEncoderを使用するというアイデアが紹介されましたが、それを機能させることができませんでした。 a pandas dataframe? の1つの列をワンホットエンコードするにはどうすればよいですか?

もう1つ、私が遭遇したすべての回答には、列名を組み合わせながら手動で入力する必要があるという解決策がありました。 Dataframe.iloc()またはスプライシングメカニズムを使用して列をリストに結合する方法はありますか?

7
Nir_J

sklearn.preprocessing.LabelBinarizer の使用例を次に示します。

In [361]: from sklearn.preprocessing import LabelBinarizer

In [362]: lb = LabelBinarizer()

In [363]: df['new'] = lb.fit_transform(df['ABC']).tolist()

In [364]: df
Out[364]:
  Col1 ABC        new
0  XYZ   A  [1, 0, 0]
1  XYZ   B  [0, 1, 0]
2  XYZ   C  [0, 0, 1]

パンダの代替:

In [370]: df['new'] = df['ABC'].str.get_dummies().values.tolist()

In [371]: df
Out[371]:
  Col1 ABC        new
0  XYZ   A  [1, 0, 0]
1  XYZ   B  [0, 1, 0]
2  XYZ   C  [0, 0, 1]
7
MaxU

tolist()を使用できます。

df['ABC'] = pd.get_dummies(df.ABC).values.tolist()

  Col1        ABC
0  XYZ  [1, 0, 0]
1  XYZ  [0, 1, 0]
2  XYZ  [0, 0, 1]
4
andrew_reece

このようなpd.DataFrameがある場合:

>>> df
  Col1  A  B  C
0  XYZ  1  0  0
1  XYZ  0  1  0
2  XYZ  0  0  1

あなたはいつでもこのようなことをすることができます:

>>> df.apply(lambda s: list(s[1:]), axis=1)
0    [1, 0, 0]
1    [0, 1, 0]
2    [0, 0, 1]
dtype: object

これは基本的に行のforループであることに注意してください。列にはnotlistデータ型があることに注意してください。objectである必要があります。これにより、データフレーム操作で速度の利点を利用できなくなります。 numpyの。

2

カテゴリ列dfを持つデータフレームABCがある場合は、これを使用してワンホットベクトルの新しい列を作成できます。

df['new_column'] = list(pandas.get_dummies(df['AB]).get_values())
0
Spandyie