Python in ExcelでDF操作(随時追加)

未分類

365 Insider Programに参加してPython in Excelのベータ版を使えるようになったので、DF操作を中心にいろいろ触ってみる。

まずExcel上にDFを作る

[数式] > [Pythonの挿入] > [Pythonサンプルを試す]

「pandasで説明する」から[サンプルの挿入]

で、Irisデータセットの表と、dfが作られた。

列のリストを取得して戻りタイプをExcel値にしたら、dfのヘッダ項目一覧を表示できる。

df.columns

抽出

特定列を抽出して新しいdfを作る

ほしい列だけを指定してから実行して実行結果セルのdfの中身を見てみると、該当する列だけになったdfが生成される。

df_1 = df[["sepal_length","species"]]

抽出条件に一致する行だけを抽出する

speciesがsetosaだけの行を抽出して新しいdfに格納する。

df_2 = df.query('species=="setosa"')

抽出条件を別セルにあらかじめ定義し、そのセルを参照して抽出する(★便利)

まず、別セルに抽出条件を入力する。species列で”virginica”の行だけを抽出したい。
“virginica”と入力したセルを用意し、PYモードセルにてそのセルを指定して文字列を生成する。

extkey = xl("I14")

抽出を行う別セルにて、定義した文字列を抽出条件に設定し実行するとspeciesが”virginica”のみのdfが生成される。

df_3 = df.query('species == @extkey')

ちなみに抽出条件の参照元セルの値を変更すると、抽出条件および抽出結果dfが動的に更新される。これは便利。

複数条件をそれぞれのセルで指定して抽出する

複数条件での抽出も問題なくできる。
文字列項目と数値項目の抽出条件をそれぞれ生成して、df.queryで&を指定すれば両方の条件に合致する行だけが抽出される。

df_4 = df.query('species == @extkey_1 & petal_width < @extval')

ソート

単一条件ソート

df.sort_valuesでソートする。

df_5 = df.sort_values('petal_length')

petal_lengthでソートされている。

列名の文字列を作成してソート

あらかじめ別セルにソートする列の文字列を作成して、そのセルを指定してソートすることもできる。

#I31セルの'sepal_width'を読み込んで、ソートキーを作成
sortkey = xl("I31")
#J31に定義した文字列を指定してソート
df_6 = df.sort_values(xl("J31"))

#文字列名を指定してもよい
df_6 = df.sort_values(sortkey)

リストを作成してソート

項目名を複数セルに列挙する。

このセルを1つずつ指定し、ソート条件リストを作成する。

sortlist_2 = [xl("J39"),xl("J40"),xl("J41")]

このリストを指定してソートすると、リストを使用して複数ソートdfが得られる。

df_8 = df.sort_values(xl("J42"))

#リスト名指定でもOK
df_9 = df.sort_values(sortlist_2)

置換・変換

引数で文字を直接指定して置換

置換はreplaceを使う。

df_10 = df.replace('setosa','s')

“setosa”が”s”に置換されている。

セルを指定して置換

置換前と後の文字列をそれぞれ別セルに準備する。

このセルをそれぞれreplaceに渡す。

df_11 = df.replace(xl("J53"),xl("J54"))

置換前セルの”virginica”が、”vi”に置換された。

リストで一括置換

置換前リストと置換後リストをあらかじめ定義して、対応する文字列を一括で置換する。

#置換前リスト
replist_before = [xl("J57"),xl("J58"),xl("J59")]

#置換後リスト
replist_after = [xl("L57"),xl("L58"),xl("L59")]
df_12 = df.replace(replist_before, replist_after)

speciesが短縮形に置換された。

数値項目をカテゴリ項目に変換

数値項目について、その値の範囲によってカテゴリを付与したい場合はpd.cutとdf.assignを使用する。
※ちなみに1セルにつきPythonオブジェクトは1個しか返せないように見えるので、以下の処理は1セルづつ分けて行う。

df_13 = df
s_tmp = pd.cut(df_13['petal_width'], bins=[0,1.0,2.0,3.0], labels=['narrow','middle','wide'])
df_13 = df.assign(petal_width_bin = s_tmp)

指定したpetal_widthに応じて、カテゴリ変数petal_width_binが追加されている。

別シートに加工結果を出力

諸々加工した表を最終的に出力する場合は、返り値のオプションで「Excelの値」を選択すればよい。

実行セルを1行1列目として、表の中身が展開される。

(随時更新)

その他Excel操作系まとめ

タイトルとURLをコピーしました