pandas:【サンプル】列データの一括置換
前提
- データフレーム作成
- python
- ディクショナリ
- lambda
サンプルコード
データ作成
置換対象文字列の作成
import pandas as pd
update_area_map = {
'岩手':'盛岡','宮城':'仙台','静岡':'浜松','沖縄':'那覇','神奈川':'横浜','愛知':'名古屋'}
dic = {'no':['01','02','03','04'],'area':['岩手_宮城','静岡_東京_青森','神奈川','愛知_その他']}
df = pd.DataFrame(dic)
print(df)
no area 0 01 岩手_宮城 1 02 静岡_東京_青森 2 03 神奈川 3 04 愛知_その他
- 「no」列
- 「area(エリア)」列 … 置換対象
- 都道府県名が入っている
- 複数ある場合は「_」でつながっている
- 今回のタスク
- エリアの「都道府県名」を「主要都市名」に置き換える
- 置換文字列は「update_map」に格納しておく(次項)
- 「update_map」にない県名はそのまま
- 想定する結果
- 01「盛岡_仙台」
- 02「浜松_東京_青森」
- 03「横浜」
- 04「名古屋_その他」
更新対象文字列
update_map = {
'岩手':'盛岡','宮城':'仙台','静岡':'浜松','沖縄':'那覇','神奈川':'横浜','愛知':'名古屋'}
print(update_map)
{'岩手': '盛岡', '宮城': '仙台', '静岡': '浜松', '沖縄': '那覇', '神奈川': '横浜', '愛知': '名古屋'}
- 県名から主要都市名を取得するディクショナリ
- 変換する文字列を設定する
- キー
- 県名
- 値
- 主要都市名
データを更新する
元データの都道府県名リストを作成
areas = set()
area_pairs = df['area'].unique()
for area_pair in area_pairs:
area = area_pair.split('_')
areas |= set(area)
print(areas)
{'その他', '宮城', '岩手', '愛知', '東京', '神奈川', '青森', '静岡'}
- set()
- リストのようなもの。重複を許さない
- エリアに入っている「都道府県名」を順に格納する
- areas
- バラバラになった都道府県名
- 今回のデータは同じ都道府県名がないが、setを使っているので重複があっても利用できるコード
置換用文字列の作成
area_map = {}
for toshi in areas:
area_map[toshi] = toshi
print('マージ前:'+str(area_map))
area_map = {**area_map, **update_map}
print('マージ後:'+str(area_map))
マージ前:{'その他': 'その他', '静岡': '静岡', '東京': '東京', '神奈川': '神奈川', '愛知': '愛知', '岩手': '岩手', '宮城': '宮城', '青森': '青森'}
マージ後:{'その他': 'その他', '静岡': '浜松', '東京': '東京', '神奈川': '横浜', '愛知': '名古屋', '岩手': '盛岡', '宮城': '仙台', '青森': '青森', '沖縄': '那覇'}
- マージ前
- 前項で設定した「areas」を使ってディクショナリを作成
- 「その他:その他」「静岡:静岡」のようにキーと値が同一
- マージ後
- 「update_area」に含まれるキーで更新していく
- 「沖縄」は「areas」に含まれないので追加になる
- 置換用のディクショナリが作成できた
- 次項で
「エリア」を更新する
print('更新前(再掲)')
print(df)
print('')
print('更新後')
df['area'] = df['area'].apply(lambda x: '_'.join([area_map[i] for i in x.split('_')]))
print(df)
更新前(再掲) no area 0 01 岩手_宮城 1 02 静岡_東京_青森 2 03 神奈川 3 04 愛知_その他 更新後 no area 0 01 盛岡_仙台 1 02 浜松_東京_青森 2 03 横浜 3 04 名古屋_その他
- 「update_area」に設定した文字列で置換された
