2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pandasにおけるif文以外での条件分岐

Posted at

はじめに

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",
    )
)

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?