[Python] 名称からコード、コードから名称への変換

[Python] 名称からコード、コードから名称への変換
データ分析の前処理で名称からコードへの変換、またはコードを名称への変換の作業はよくあると思います。今回は、その変換をPythonの辞書(dict)で使って行う方法です。

実際に行っていくので、変換するデータと変換対応のリストを用意します。

In [1]:
import pandas as pd
import numpy as np

#性別
prefecture_labels = ["東京都", "神奈川県","千葉県","埼玉県"]
weight = np.array([.4,.2,.2,.2])
prefecture = np.random.choice(prefecture_labels, 100, p=weight)

#年代
age_cd = ["1", "2", "3", "4", "5"]
weight = np.array([.2, .2, .2, .2, .2])
age = np.random.choice(age_cd, 100, p=weight)

Data = pd.DataFrame({'prefecture':prefecture, 'age':age})
Data.head()
Out[1]:
prefecture age
0 東京都 4
1 千葉県 5
2 埼玉県 1
3 東京都 4
4 千葉県 1

都道府県の方は名称になっていて、ageの方は文字型数字のコードにしています。
このデータに対して、以下の対応リストがあるとします。

都道府県のリスト
In [2]:
#都道府県の対応リスト
prefecture_list = pd.DataFrame({'Prefecture_labels':prefecture_labels,
                         'Prefecture_cd':["1","2","3","4"],
                        })
prefecture_list
Out[2]:
Prefecture_labels Prefecture_cd
0 東京都 1
1 神奈川県 2
2 千葉県 3
3 埼玉県 4
年代のリスト
In [3]:
#年代の対応リスト
age_list = pd.DataFrame({'Age_labels':['10代','20代','30代','40代','50代'],
                         'Age_cd':age_cd
                        })
age_list
Out[3]:
Age_labels Age_cd
0 10代 1
1 20代 2
2 30代 3
3 40代 4
4 50代 5

この2つのリストを用いて、データの都道府県をコードへ、年代を名称へと変換させていきます。

対応リスト辞書の作成

名称とコードの対応関係を辞書にしておきます。

In [4]:
prefecture_dict = dict(zip(prefecture_list['Prefecture_labels'],prefecture_list['Prefecture_cd']))
prefecture_dict
Out[4]:
{'東京都': '1', '神奈川県': '2', '千葉県': '3', '埼玉県': '4'}
In [5]:
age_dict = dict(zip(age_list['Age_labels'],age_list['Age_cd']))
age_dict
Out[5]:
{'10代': '1', '20代': '2', '30代': '3', '40代': '4', '50代': '5'}

どちらもkeyが名称、valueがコードとしています。

辞書を使った名称変換

map関数を使って、都道府県データの名称をコードに変換します。

In [6]:
Data['prefecture_cd'] = Data['prefecture'].map(prefecture_dict)
Data.head()
Out[6]:
prefecture age prefecture_cd
0 東京都 4 1
1 千葉県 5 3
2 埼玉県 1 4
3 東京都 4 1
4 千葉県 1 3

年代の方はvalueの方がマッチさせる対象なので、keyとvalueを入れ変えてから変換を行います。最初の辞書作るときに入れ替えおくこともできましたが、あえてこのような構造にしておきました。こういう状況もよく経験したので。

In [7]:
age_dict_rev = dict([(v,k) for k,v in age_dict.items()])
age_dict_rev
Out[7]:
{'1': '10代', '2': '20代', '3': '30代', '4': '40代', '5': '50代'}
In [8]:
Data['age_labels'] = Data['age'].map(age_dict_rev)
Data.head()
Out[8]:
prefecture age prefecture_cd age_labels
0 東京都 4 1 40代
1 千葉県 5 3 50代
2 埼玉県 1 4 10代
3 東京都 4 1 40代
4 千葉県 1 3 10代

ちゃんと変換できました。
単純に番号を振りたい場合などは、以下のようにnp.arangeなどを利用して辞書を作成すればOKです。

In [9]:
index = [int(x) for x in np.arange(0,len(prefecture_list))] #インデックスのリストを作成

dict(zip(prefecture_list['Prefecture_labels'],index))
Out[9]:
{'東京都': 0, '神奈川県': 1, '千葉県': 2, '埼玉県': 3}

まとめ

この名称⇒コード、コード⇒名称の処理は、機械学習をする際や機械学習の結果を解釈する際に頻繁に行う処理なので、覚えておいて損はないと思います。もっと効率的な方法があるかも知れませんが、その際はご教示いただけると嬉しいです。でわでわ。

Pythonカテゴリの最新記事