
[Python] pandas 特定の列に関数を適用する
はじめに
pandasを使って、特定の列に関数を適用する実装を行います。
今回は、名簿(CSVファイル)の「名前(カタカナ)」の列に対して、ローマ字変換した列を新規に追加する、という処理を行います。
Pythonで、日本語からローマ字変換する実装については、下記でまとめています。
使用する名簿のデータは、「個人情報テストデータジェネレーター」を使用してダミーデータ作成しました。
使用するライブラリ
pandas
データ分析、機械学習の実装で最も使用されるライブラリです。
pykakasi
漢字(ひらがな、カタカナ)をローマ字に変換するライブラリです。
動作環境
・windows10
・Jupyter Notebook 6.4.3
・Python 3.8.11
実装
全体のコードは、下記です。
import pandas as pd
import pykakasi
kakasi = pykakasi.kakasi()
def convert_kana_2_romaji(text):
"""
カタカナをローマ字に変換する
Parameters
----------
text: str
変換したい文字列。
Returns
-------
name : str
ローマ字変換した文字列。
"""
result_list = kakasi.convert(text)
name = ''.join([result['passport'].upper() for result in result_list])
return name
# csvファイル読み込み
df = pd.read_csv('./dummy.csv')
# ローマ字変換して、新規の列に追加
df['氏名(ローマ字)'] = df['氏名(カタカナ)'].map(convert_kana_2_romaji)
使用する名簿のデータの列は、下記です。
・氏名
・氏名(ひらがな)
・氏名(カタカナ)
・メールアドレス
・電話番号
処理の流れは、
・CSVファイルの読み込み
・「氏名(カタカナ)」列に対して、カタカナをローマ字に変換する関数を適用
・適用した結果を、「氏名(ローマ字)」列に新規追加
となります。
pandasの行、列に関数を適用する
pandasのDataFrame、Seriesに対して、関数を適用する場合、
・Numpyの関数
・自分で作成した関数(無名関数も含む)
の2つのパターンで設定することができます。
DataFrameの各要素、つまりすべての行、列に対して関数を適用する場合、
map
apply
のいずれかのメソッドを使用することができます。
しかし、今回のケースのように、特定の行に対して関数を適用することはできないため、方法としては、
・列を選択し、行をSeriesとして取得
・取得した行に対して、map、applyのいずれかのメソッドを使って関数を実行
・適用した結果を、特定列に上書き、もしくは列を新規追加
となります。
今回の実装だと、下記のコードになります。
df['氏名(ローマ字)'] = df['氏名(カタカナ)'].map(convert_kana_2_romaji)
mapメソッドの戻り値は、関数を適用したSeriesです。
map,applyの違い
関数が使用できるオブジェクトが異なります。
・map…Seriesで使用可能
・apply…Series、DataFrameの各行・列で使用可能
まとめ
今回は、Pythonのpandasを使って、特定の列に関数を適用する実装を行いました。
map,applyメソッドを使用して実行することで、for文を使って処理するよりも、処理時間が早いこと、実装コードが短いことがメリットになります。
参考サイト