pandas で 3 項演算子 like な処理を行う
pandas で 3 項演算子 like な処理を行う

pandas で 3 項演算子 like な処理を行う

はじめに

Pandas で 3 項演算子のような処理を行いたい事がままあるのですが、簡単に行う方法を記載します

解決方法

以下のようなデータを持っている DataFrame を考えます

df = pd.DataFrame({'A': [1, 0, 1],
				           'B': ['B1', 'B2', 'B3'],
				           'C': ['C1', 'C2', 'C3']})

ここで、カラム A が 1 以上であれば カラム C をカラム B の値に置換したいとします

普通の python 的な 3 項演算子で記述しようとすると以下のようになりますが、これは実行できません

df['C'] = df['B'] if df['A'] >= 1 else df['C']
実行不可能なコード

loc で代入

loc にて boolean Series と label を指定すると、boolean Series で True となってい行を取得出来る

以下のようにすると、 A 列が 1 以上 の行の C 列を Series として取得できます

>>> df.loc[df['A'] >= 1, 'C']
0    C1
2    C3
Name: C, dtype: object

# ちなみに、配列を渡すと DataFrame として取得できます
>>> df.loc[df['A'] >= 1, ['C']]

この性質を利用すると、Pandas の場合は以下のようなコードで上記の 3 項演算子と同じような処理が実現可能です

df.loc[df['A'] >= 1, 'C'] = df['B']

これは条件を満たす行の C 列を取得し、そこに値を代入すという事をしています

numpy.where を使う

同様の処理を numpy の where を使って実現する事もできます

以下は、条件に応じて定数を代入する例です

df['D'] = np.where(df['A'] >= 1, True, False)

以下のように Series の値を代入する事もできます

df['D'] = np.where(df['A'] >= 1, df['B'], df['C'])

まとめ

Pandas で 3 項演算子 like な処理を行う際の Tips を記載しました