pandas:【サンプル】列データの一括置換


前提

サンプルコード

データ作成

置換対象文字列の作成

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」に設定した文字列で置換された


Posted by futa