PandasのApply関数を使って新しい行を複数生成する
まとめ
つまるところExcelでよくやる既存の列から新たにデータ列を追加するというやつです。
- ポイントを箇条書きにすると:
- dataframeを引数に取る関数を作ってapply()関数に入れ,axis=1で処理
- 2つ目以降の引数はargsで与える
- 返り値を複数行で生成したいなら
result_type="expand"
にする
- コードにすると:
df["newcolumn"] = df.apply(yourfunction,axis=1)
df[["newcolumn1","newcolumn2"]] = df.apply(yourfunction,axis=1,result_type="expand")
参考にした文献
実践例
データを共有するのがだるいのでKaggleのノートブックで例を載せます。
Youtubeの概要と再生回数の関連に関するデータセットです。
Trending YouTube Video Statistics | Kaggle
地味にEncodingが厄介でした。
# load jp video data import codecs with codecs.open("/kaggle/input/youtube-new/JPvideos.csv", "r", "utf-8", "ignore") as file: df = pd.read_table(file, delimiter=",") df.head()
ここから例えば適当にいくつか項を追加してみます。
# 高評価の割合などに関する項を追加 ## ゼロ割防止 def save_divide(a,b): return a/b if b else 0 def add_likerate(df): likeperview= df["likes"]/df["views"] dislikeperview= df["dislikes"]/df["views"] likerate = save_divide(df["likes"],(df["likes"]+df["dislikes"])) return likeperview,dislikeperview,likerate ## copyして置換 newdf = df.copy() newdf[["likeperview","dislikeperview","likerate"]] = df.apply(add_likerate,axis=1,result_type="expand") newdf.head()
例えば高評価率をsort して吐き出して見ます。
import matplotlib.pyplot as plt # sort sorteddf = newdf.sort_values("likeperview") sorteddf.plot.bar(y=["views"])
左から高評価が高い動画の再生数になりますが,こうしてみると予想通り高評価率と再生数はそこまで強く相関していなそうというのが読み取れます(要解析)。
numpyなどをちょっといじる程度ではMATLABやExcelに利便性でかなわない感じがありますが,Pandasに習熟したら圧倒的にPythonのほうがやりやすい用に感じます。
おまけ
縦方向に似たようなことをするときのTipsです。