63 views
【1】やりたいこと
以下の CSVファイルがある。
田中 一郎,1978/5/25,神奈川県伊勢原市鈴川2-5 加藤 淳也,1982/8/30,徳島県鳴門市撫養町斎田大堤14 佐伯 裕二,1990/4/12,新潟県上越市土橋1914 串本 直樹,1976/5/11,宮崎県児湯郡都農町下浜3丁目
これを、以下の仕様でデータ変換したい。
1. 名字だけにする。
2. 年だけにする。
3. 番地以降を削除する。
↓ 以下のようにしたい。
田中,1978,神奈川県伊勢原市鈴川 加藤,1982,徳島県鳴門市撫養町斎田大堤 佐伯,1990,新潟県上越市土橋 串本,1976,宮崎県児湯郡都農町下浜
【2】やってみる
一先ず以下のコードで実現できた。
予想外の動きをしてくれたのが re.sub() のところだ。
正規表現で \d.* つまり数字が出現した後を削除するように指定しているところだ。
なんと!
半角数字だけでなく、全角数字も処理対象にしてくれている!!
import pandas as pd import re # CSVファイルをロード file_path = 'data.csv' df = pd.read_csv(file_path, header=None) # 第1列: 苗字を抽出 df[0] = df[0].str.split().str[0] # 第2列: 年を抽出 df[1] = df[1].str.split('/').str[0] # 第3列: 住所の番地以降を削除 df[2] = df[2].apply(lambda x: re.sub(r'\d.*', '', x)) # CSVファイルとして出力 output_path = 'data_conv.csv' df.to_csv(output_path, index=False, header=False, encoding='utf-8')
以下のように、すべてを df[n].apply で書くこともできる。
# 第1列: 苗字を抽出 df[0] = df[0].apply(lambda x: x.split()[0]) # 第2列: 年を抽出 df[1] = df[1].apply(lambda x: x.split('/')[0]) # 第3列: 住所の番地以降を削除 df[2] = df[2].apply(lambda x: re.sub(r'\d.*', '', x))