【Python】Excelの読み替えテーブルを使ってテキスト内容を読み替える

Python

処理概要

  • テキストファイルの内容をExcelの読替テーブルに従って読み替える
  • ここでは郵便番号に該当する住所に読み替える

読替テーブル.xlsx

郵便番号 市区町村 住所
150-0011 渋谷区
150-0012 渋谷区 広尾
150-0013 渋谷区 恵比寿

input.txt(タブ区切りのテキストファイル)

NAME ZIPCODE
佐藤 150-0011
山田 151-0022
鈴木 150-0012
田中 150-0013

処理内容

main.py

  1. テキストファイルを読み込む
  2. 読替テーブルを読み込む
  3. テキストファイルのZIPCODE列と読替テーブルの郵便番号列をマッチングさせる
  4. 合致した場合はZIPCODEを住所に読み替える
  5. 読み替え後のテキストファイルを出力する

output.txt(読み替え後の出力ファイル)

NAME ADDRESS
佐藤
山田 151-0022
鈴木 広尾
田中 恵比寿

処理イメージ

処理イメージ

事前準備

  • カレントディレクトリに入力データと読替テーブルを配置しておく

コード

from __future__ import annotations

import pandas as pd

def main() -> None:

    input_txt = 'input.txt'
    table_xlsx = '読替テーブル.xlsx'
    output_txt = 'output.txt'

    # 入力ファイルをデータフレームに格納する
    df = pd.read_csv(input_txt, sep='\t', dtype=str).fillna('')
    # 読替テーブルをデータフレームに格納する
    replace_table = pd.read_excel(table_xlsx, dtype=str).fillna('')

    # 読替テーブルのキーになる列と、読み替える値の列で辞書を作る
    key_col = '郵便番号'
    replace_col = '住所'
    mapping_dict = dict(
        zip(
            replace_table[key_col].astype(str),
            replace_table[replace_col].astype(str)
        )
    )

    # ZIPCODE を 住所 で置換(見つからない場合は元の値を保持)
    df['ZIPCODE'] = (df['ZIPCODE'].astype(str).map(mapping_dict).fillna(df['ZIPCODE']))

    # 読み替え後のファイル出力
    df = df.rename(columns={'ZIPCODE': 'ADDRESS'})
    df.to_csv(output_txt, sep='\t', index=False, encoding='utf-8')

if __name__ == '__main__':
    main()

カスタマイズ版

main.py

  • 市区町村と住所を連結した値に読み替える

output.txt

NAME CONCAT_ADDRESS
佐藤 渋谷区東
山田 151-0022
鈴木 渋谷区広尾
田中 渋谷区恵比寿

コード

from __future__ import annotations

import pandas as pd

def main() -> None:

    input_txt = 'input.txt'
    table_xlsx = '読替テーブル.xlsx'
    output_txt = 'output.txt'

    # 入力ファイルをデータフレームに格納する
    df = pd.read_csv(input_txt, sep='\t', dtype=str).fillna('')
    # 読替テーブルをデータフレームに格納する
    replace_table = pd.read_excel(table_xlsx, dtype=str).fillna('')

    # 複数列を連結した新しい列を作る
    replace_table['連結住所'] = (replace_table['市区町村'] + replace_table['住所'])

    # 読替テーブルのキーになる列と、読み替える値の列で辞書を作る
    key_col = '郵便番号'
    replace_col = '連結住所'
    mapping_dict = dict(
        zip(
            replace_table[key_col].astype(str),
            replace_table[replace_col].astype(str)
        )
    )

    # ZIPCODE を 住所 で置換(見つからない場合は元の値を保持)
    df['ZIPCODE'] = (df['ZIPCODE'].astype(str).map(mapping_dict).fillna(df['ZIPCODE']))

    # 読み替え後のファイル出力
    df = df.rename(columns={'ZIPCODE': 'CONCAT_ZIPCODE'})
    df.to_csv(output_txt, sep='\t', index=False, encoding='utf-8')

if __name__ == '__main__':
    main()

Python

Posted by junichi