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

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

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

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

pandas

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

Q&A

1回答

960閲覧

pandasでカテゴリごとの「その時より過去の平均」をもった列を効率よく作成する方法を教えてください。

kazucchi4465

総合スコア7

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2020/03/07 01:34

pandasでデータ加工を行っています。
以下のようなデータフレームを想定しています。

カテゴリ
A200010
A200030
B200015
A200150
B200125
B200120
A200210
B200220
A200310
B200310

このデータに対して、「カテゴリ」の値ごとに過去2年分の「値」の平均値を持った以下のようなデータフレームを作りたいと思っています。

|カテゴリ|年|値|過去2年平均
|:--|:--:|--:|
|A|2000|10|NA
|A|2000|30|NA
|B|2000|15|NA
|A|2001|50|NA
|B|2001|25|NA
|B|2001|20|NA
|A|2002|10|30
|B|2002|45|20
|A|2003|10|30
|B|2003|10|30

このようなデータフレームを作る際に、現在は以下のようにしています。

python

1df_agg = pd.DataFrame() 2for year in range(2002, 2004): 3 df_temp = df[df["年"].between(year-2, year-1)].groupby("カテゴリ")["値"].mean().rename("過去2年平均").reset_index() 4 df_temp["年"] = year 5 df_agg = pd.concat([df_agg, df_temp]) 6df = pd.merge(df, df_agg, on=["年", "カテゴリ"], how="left")

これで実現できているものの、何か回りくどいような気がしますし、処理にも結構時間がかかってしまっています。

もしもこれよりもより効率的で高速な方法があれば教えていただけないでしょうか。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

python

1import pandas as pd 2import io 3 4data="""カテゴリ 年 値 5A 2000 10 6A 2000 30 7B 2000 15 8A 2001 50 9B 2001 25 10B 2001 20 11A 2002 10 12B 2002 45 13A 2003 10 14B 2003 10""" 15 16df=pd.read_csv(io.StringIO(data),delimiter='\t') 17 18dfs = df.groupby(['カテゴリ','年']).sum().rolling(2).mean().reset_index('年') 19dfs = dfs[dfs['年'] > 2001].rename({'値': '過去2年平均'},axis=1) 20 21df.merge(dfs.reset_index('カテゴリ'),how='outer', on=['カテゴリ','年']) 22 23""" 24 カテゴリ 年 値 過去2年平均 250 A 2000 10 NaN 261 A 2000 30 NaN 272 B 2000 15 NaN 283 A 2001 50 NaN 294 B 2001 25 NaN 305 B 2001 20 NaN 316 A 2002 10 30.0 327 B 2002 45 45.0 338 A 2003 10 10.0 349 B 2003 10 27.5 35"""

結果が違うのが気になりますが、一応できているかと思います。

投稿2021/07/02 09:36

toshikawa

総合スコア388

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問