【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
- テキストファイルを読み込む
- 読替テーブルを読み込む
- テキストファイルのZIPCODE列と読替テーブルの郵便番号列をマッチングさせる
- 合致した場合はZIPCODEを住所に読み替える
- 読み替え後のテキストファイルを出力する
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()