1. ホーム
  2. python

[解決済み] pandasのdataframeでカテゴリデータを変換する

2022-06-14 12:51:58

質問

このようなデータ(列が多すぎる)を持つデータフレームがあります。

col1        int64
col2        int64
col3        category
col4        category
col5        category

カラムはこんな感じです。

Name: col3, dtype: category
Categories (8, object): [B, C, E, G, H, N, S, W]

このように、カラムの値をすべて整数に変換したい。

[1, 2, 3, 4, 5, 6, 7, 8]

1カラムの場合はこれで解決しました。

dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes

これで、データフレームに2つのカラムができました - old col3 と新しい c を追加し、古いカラムを削除する必要があります。

それは悪い習慣です。それは仕事ですが、私のデータフレームには多くの列があり、私はそれを手動で行うことを望んでいません。

どのようにこのpythonicとちょうど巧妙に行うのですか?

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

まず、Categoricalカラムを数値コードに変換するには、以下のようにすると簡単です。 dataframe['c'].cat.codes .

さらに、データフレーム内の特定の dtype を持つ全ての列を自動的に選択するために select_dtypes . この方法では、複数の列と自動的に選択された列に対して、上記の操作を適用することができます。

まずデータフレームの例を作ります。

In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})

In [76]: df['col2'] = df['col2'].astype('category')

In [77]: df['col3'] = df['col3'].astype('category')

In [78]: df.dtypes
Out[78]:
col1       int64
col2    category
col3    category
dtype: object

次に select_dtypes を使って列を選択し、さらに .cat.codes をそれぞれのカラムに適用すると、次のような結果になります。

In [80]: cat_columns = df.select_dtypes(['category']).columns

In [81]: cat_columns
Out[81]: Index([u'col2', u'col3'], dtype='object')

In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

In [84]: df
Out[84]:
   col1  col2  col3
0     1     0     0
1     2     1     1
2     3     2     0
3     4     0     1
4     5     1     1