はじめに
Pandasを利用し、データ変換処理を行う際に多用した
if文を使わずに条件分岐を行う方法についてまとめたものになります。
loc
使い所
A列の値が〇〇の場合に、B列に〇〇の任意の値を入れたい場合に利用する。
使用感としては、elseがないif文がイメージとして近い。
使用例
下記のコードでは、指定の列の条件抽出した行に対して値を入れているが
前提としてdfAとdfBは同一のデータ数(行数)である。
まず、dfA["列名A"]における要素が"Python"である行を取得し
それと同じ行番号であるdfB["列名B"]の行が値を入れる先として指定される。
そして指定したdfB["列名B"]の行に、"固定値(文字列) + dfA["列名A"]"の値を入れるといった処理になる。
dfB.loc[dfA["列名A"] == "Python", "列名B"] = 固定値 + dfA["列名A"]
numpy.where
使い所
A列の値によって、B列に入れる値を分岐させたい場合に利用する。
使用感としては、elseがあるif文のイメージとなる。
また、locと同じように参照するdfは同一のデータ数(行数)である必要があり
dfA["列名A"]の条件に合致する行と、dfB["列名B"]に値を入れる行は、
同じインデックス(行番号)を持つことになる。
そのため、処理による条件チェックと値の代入は、対応する行どうしでなされる。
使用例
下記のコードでは、dfAの要素の値によってdfBに入れる値を分岐させている。
処理の内容は、値を入れる先としてdfB["列名B"]を指定し
dfA["列名A"]の値が"Python"であれば、"True"を
そうでなければ"False"を入れる処理を行なっている。
import numpy
dfB["列名B"] = numpy.where(
dfA["列名A"] == "Python",
"True",
"False",
)
ネストについて
numpy.whereはネストすることも可能である。
if文と同じく、過度なネストは可読性が損なわれるので利用する際は注意が必要となる。
処理としては、「dfA["列名A1"] == "Python"」がTrueだった場合に
ネストの中に入り、dfA["列名A2"]の値をチェックして入れる値を分岐させている。
import numpy
dfB["列名B"] = numpy.where(
dfA["列名A1"] == "Python",
numpy.where(
dfA["列名A2"] == "3",
"Python 3",
"Python 2",
),
"False",
)
replace
使い所
Aと記載されていた場合は、Bに一括変換するといった場合に利用する。
dfAの値をdfBに代入する際に、replaceを用いて一括変換して代入する方が
上記のlocとnumpy.whereを利用するよりもシンプルに処理を行える
使用例
dfA["列名B"]の値を取得し、
"Python 2"は"py2"へ、"Python 3"は"py3"へ置換をした後で
dfB["列名B"]に対して代入を行なっている。
dfB["列名B"] = (
dfA["列名A"]
.replace(
"Python 2",
"py2",
)
.replace(
"Python 3",
"py3",
)
)
参考
- [Python] pandas 条件抽出した行の特定の列に、一括で値を設定する
- Pandasでif文に2つ以上の条件が入る変換
- pandasで条件に応じて値を置換(where, mask)
- NumPyで条件に応じた処理を行うnp.whereの使い方
- pandas.DataFrame, Seriesの要素の値を置換するreplace