pandasのデータフレームで特定の列に対して、その数値を2倍にするなど同じような処理を実施したい、特定条件で1、0に置換してフラグにしたい・・・なんて時があります。データフレームの列に対してfor文を回すことでも実装可能ですが、データフレームに対してfor文を使うと処理がとても遅くなるのでナンセンスです。
無名関数(lambda)を使おう
そんなときは無名関数(lamda)を使用することで解決できます。
例えば以下のようなデータがあったとします。
data = [ [1, 2, 3], [2, 4, 6], [3, 6, 9], [4, 8, 12] ] data = pd.DataFrame(data) data.columns = ['a', 'b', 'c'] data
このデータフレームのaの列の数値を2倍にしたいときは以下のように記述します。
列aの要素を2倍にする data['a'].apply(lambda x : x * 2)
<結果>
0 2 1 4 2 6 3 8 Name: a, dtype: int64
またif文を組み合わせて条件分岐も可能です。よくで文字列や数値を特定の条件で1か0のフラグに変換する処理はデータの前処理でよくやるので是非使いこなせるようになっておきたいところです。
# 列aの要素が3より大きい場合は1に置換、それ以外の場合は0に置換 data['a'].apply(lambda x : 1 if x > 3 else 0)
<結果>
0 0 1 0 2 0 3 1 Name: a, dtype: int64
elifが絡んでくる条件分岐も以下のように記述できます。まあここまで条件が多くなると普通に関数を定義しておいたほうがいいかもですね。
# data['a'].apply(lambda x : 'xは1未満です' if x < 1 else ('xは1以上2未満です' if x >= 1 and x < 2 else('xは2以上3未満です' if x >= 2 and x < 3 else 'xは3以上です')))
<結果>
0 xは1以上2未満です 1 xは2以上3未満です 2 xは3以上です 3 xは3以上です Name: a, dtype: object
<おまけ>
型変換を行いたい場合は、日付型であれば列に対してto_datetime()などで一括変換が可能です。
コメント