1. ホーム
  2. python

[解決済み] リストを含むpandasのカラムから一発でエンコードするには?

2023-06-06 17:56:35

質問

要素のリストからなるpandasのカラムを、ユニークな要素の数だけカラムに分割したいのですが、例えば、以下のようになります。 one-hot-encode それらは(値を持つ 1 は、行に存在する所定の要素を表し 0 は不在の場合)。

例えば、データフレームをとって df

Col1   Col2         Col3
 C      33     [Apple, Orange, Banana]
 A      2.5    [Apple, Grape]
 B      42     [Banana] 

に変換したいと思います。

df

Col1   Col2   Apple   Orange   Banana   Grape
 C      33     1        1        1       0
 A      2.5    1        0        0       1
 B      42     0        0        1       0

pandas/sklearnを使って実現するにはどうしたらいいでしょうか?

どのように解決するのですか?

私たちは sklearn.preprocessing.MultiLabelBinarizerを使用することもできます。 :

よく使うのは スパース DataFrameを使いたいことがあります。

スパース・ソリューション(Pandas v0.25.0+用)

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer(sparse_output=True)

df = df.join(
            pd.DataFrame.sparse.from_spmatrix(
                mlb.fit_transform(df.pop('Col3')),
                index=df.index,
                columns=mlb.classes_))

の結果です。

In [38]: df
Out[38]:
  Col1  Col2  Apple  Banana  Grape  Orange
0    C  33.0      1       1      0       1
1    A   2.5      1       0      1       0
2    B  42.0      0       1      0       0

In [39]: df.dtypes
Out[39]:
Col1                object
Col2               float64
Apple     Sparse[int32, 0]
Banana    Sparse[int32, 0]
Grape     Sparse[int32, 0]
Orange    Sparse[int32, 0]
dtype: object

In [40]: df.memory_usage()
Out[40]:
Index     128
Col1       24
Col2       24
Apple      16    #  <--- NOTE!
Banana     16    #  <--- NOTE!
Grape       8    #  <--- NOTE!
Orange      8    #  <--- NOTE!
dtype: int64


濃厚な溶液

mlb = MultiLabelBinarizer()
df = df.join(pd.DataFrame(mlb.fit_transform(df.pop('Col3')),
                          columns=mlb.classes_,
                          index=df.index))

結果

In [77]: df
Out[77]:
  Col1  Col2  Apple  Banana  Grape  Orange
0    C  33.0      1       1      0       1
1    A   2.5      1       0      1       0
2    B  42.0      0       1      0       0