粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

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

参考にした文献

pandas.pydata.org qiita.com

実践例

データを共有するのがだるいので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"])

左から高評価が高い動画の再生数になりますが,こうしてみると予想通り高評価率と再生数はそこまで強く相関していなそうというのが読み取れます(要解析)。

f:id:ossyaritoori:20201003153345p:plain

numpyなどをちょっといじる程度ではMATLABExcelに利便性でかなわない感じがありますが,Pandasに習熟したら圧倒的にPythonのほうがやりやすい用に感じます。

おまけ

縦方向に似たようなことをするときのTipsです。

teratail.com