質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

3604閲覧

pandasでグループごとの平均値を持ったカラムを高速に作る方法を教えてください。

kazucchi4465

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2020/03/06 09:09

編集2020/03/06 11:58

前提・実現したいこと

pandasでグループごとの平均値を持ったカラムを高速に作りたいと思っています。
目的としては、機械学習を行っており、ターゲットエンコーディングのために特定のカラムの値ごとに目的変数の平均を求める処理をしています。
しかしその処理に結構時間がかかっており、多くのカラム(やその組み合わせ)に対してターゲットエンコーディングを行っているのもあって、試行錯誤をするためにできればより高速に実現したいと思っています。
現在は以下のようにgroupby()で平均値を求めてから元のデータフレームにmerge()するという方法を取っています。

python

1df_temp = df.groupby("集計変数")["目的変数"].mean().rename("平均目的変数").reset_index() 2df = pd.merge(df, df_temp, on="集計変数", how="left")

ただこの方法だとどうもmerge()が結構遅いなと思っています。
特に集計変数が1変数ではなく複数変数の組み合わせになっている場合は時間がかかっているように思います。

そのため、
①merge()を使わないで同じことを高速に実現する方法はあるか
②merge()自体を高速化する方法はあるか
の二点、もしくはどちらか一方でも、もしご存知の方がいらっしゃいましたら教えていただけないでしょうか。
どうぞよろしくお願いいたします。

(追記)
マシンスペックは以下の通りです。
OS:windows 10
CPU: Intel Core i7-9700K
メモリ: 16GB
GPU: NVIDIA GeForce RTX 2700 SUPER
開発環境: jupyter notebook

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/03/06 10:51

マシンスペックが不明ではありますが、高速化の一方法としてはマルチプロセスもありかと思います。
kazucchi4465

2020/03/06 11:57

マシンスペックを記載するのを失念しておりました。ご指摘ありがとうございます。 OS:windows 10 CPU: Intel Core i7-9700K メモリ: 16GB GPU: NVIDIA GeForce RTX 2700 SUPER 開発環境: jupyter notebook です。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

groupby() のあとに transform() を使うと、元の DataFrame と同じ形状になるので、そのまま列を追加できます。

Group By: split-apply-combine — pandas 1.0.1 documentation

python

1import pandas as pd 2 3data = pd.DataFrame( 4 { 5 "length": [7, 2, 4, 1, 2], 6 "species": ["A", "A", "B", "B", "C"], 7 } 8) 9 10data["mean"] = data.groupby("species").transform("mean") 11print(data) 12# length species mean 13# 0 7 A 4.5 14# 1 2 A 4.5 15# 2 4 B 2.5 16# 3 1 B 2.5 17# 4 2 C 2.0

投稿2020/03/06 16:14

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazucchi4465

2020/03/06 20:42

まさに知りたかったことをご回答いただきましてありがとうございます!大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問