こんにちは,shun(@datasciencemore)です!!
今回はassignについて学習していきます.
assignは,列の追加・更新をするメソッドです.
既存の列を更新したり,新規の列を追加したりすることができます.
今回はdiamondsデータを使用します.
diamondsデータをそのまま使用すると列数が多いので,必要な列のみを抽出しています.
0.準備
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# パッケージ読み込み import pandas as pd import numpy as np import seaborn as sns # データフレームの表示行数を指定 pd.set_option('display.max_rows', 5) # データ読み込みと列選択(メソッドチェーン) df = \ sns\ .load_dataset('diamonds')\ .filter(["depth", "table", "color"]) |
1 2 3 4 5 6 |
# color列を更新,new_1列とnew_2列を追加 df.assign( color = "color", new_1 = 1, new_2 = 2 ) |
ベクトルを指定する箇所でスカラを指定していますが,スカラを指定すると自動的にブロードキャストされ,ベクトルになります.
1.assignの基本
assignについてもう少し詳細に説明すると
こんな感じで,dfを入力に,ベクトルを出力した関数を設定することができます.
このように設定することでdfを入力とした関数による出力であるベクトルを指定した列に対して,割り当てることができます.
1 2 3 4 5 6 |
# 2 * depth + 5 * tableをする関数定義 def func_1(x): return 2 * x["depth"] + 5 * x["table"] # new列に出力であるベクトルを追加 df.assign(new = func_1) |
さて,設定する関数ですが,普通の関数を指定するよりもlambda式と言われる関数を指定するほうが一般的です.
2.lambda式
lambda式とは,普通の関数から,関数名とreturnを削り,無駄をそぎ落とした関数のことです.
lambda式のメリットは,
ちょっとした処理に対し,関数を定義しなくてよい.
ということです.
今回の例のように入力に対して,ただ1を足すなど単純な処理について,いちいち関数を定義するのは手間がかかるので,
そのようなときはlambda式を利用すると楽にコーディングすることができます.
1 2 |
# new列にlambda式で2 * depth + 5 * tableを追加 df.assign(new = lambda x:2 * x["depth"] + 5 * x["table"]) |
3.条件による分岐
ここでassignを使用した応用例について紹介します.
assignとnumpyのwhereを使用すると条件により処理を切り替えることができます.
例えば,この列の数値が5以上なら処理1で5未満なら処理0でという感じです.
こちらについては,言葉だけだとよくわからないと思うので,実際にコーディングして理解を深めていただければと思います.
1 2 3 4 5 6 7 8 9 10 |
# color列が"E"⇒"E"をnew列に追加, # それ以外⇒"not_E"をnew列に追加 df.assign( new = lambda x:np.where( x["color"] == "E", "E", "not_E" ) ) |
4.goodとbadの比較
列の追加・更新に関するgoodとbadを比較しましょう.
まずgoodは今まで説明してきたとおり,assignを使用する方法です.
次にbadの紹介です.
badは[]を使用して列を追加する方法です.
これがbadな理由は,列の追加・更新と同時にdfを書き換えてしまうからです.
これは要するに再帰代入をしているのと同じです.
以前,メソッドチェーンのところで再帰代入はしないようにと説明したことを思い出してください.(以下の図を参照)
再帰代入するとdfの中身が入れ替わってしまうので,想定外のコーディングをしてしまうことが多くなります.
改めて強調しますが,再帰代入はできるだけ避けるようにしましょう!!
good
1 2 |
# good df.assign(table = lambda x:x["table"] + 1) |
1 2 |
# dfの中身は変わらない df |
bad
1 2 |
# bad df["table"] = df["table"] + 1 |
1 2 |
# dfの中身が変わる. df |
まとめ
今回は,assign:列の追加・更新について学習してきました.
列の追加・更新は,assignを使用する方法と[]を使用する方法がありますが,オススメはassignになります.
assignはlambda式と組み合わせてよく使用します.
lambda式,名前がいかつく難しそうに見えますが,慣れると便利です.
assignもquery, filterと同様,使用頻度がとても高いので,ぜひ使いこなせるようになってください!!
それでは,お疲れさまでした!!
次回
-
【pandas】merge:キー結合【データフレーム処理】
こんにちは,shun(@datasciencemore)です!! 今回はmergeについて学習していきます. mergeは,キー結合をするメソッドです. キー結合とは,2つのデータフレームをキーをもと ...
続きを見る