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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

979閲覧

時系列データの抽出、平均の算出法

mamepon

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

1クリップ

投稿2020/04/30 10:01

編集2020/04/30 11:17

時系列データの抽出、平均の算出法

閲覧していただきありがとうございます。

以下のデータには東京と大阪(都道府県)における、りんごとみかん(果物)の値段、そのデータが計測された年(年)の情報があります。

今回わからないことは、全ての行において、値段をその行より前の年、かつ、その行と同一条件(同一果物、同一都道府県)で抽出し、その集団の平均値を別のカラム(以下にあるゴールにおいては結果カラム)へ出力する方法です。

例えば最初の行は 果物:りんご、都道府県:東京、年:2020 なので、果物がりんご、かつ都道府県が東京、かつ2020年より前(2020>年)の集団を抽出してきて、その集団の平均値を求めて出力するということになります。

これを全ての行に適用したいです。

python

1df = pd.DataFrame([['りんご', '東京', 157, 2020], 2 ['りんご', '東京', 172, 2019], 3 ['りんご', '東京', 146, 2018], 4 ['りんご', '東京', 152, 2017], 5 ['りんご', '大阪', 135, 2020], 6 ['りんご', '大阪', 165, 2019], 7 ['りんご', '大阪', 148, 2018], 8 ['りんご', '大阪', 176, 2017], 9 ['みかん', '東京', 82, 2020], 10 ['みかん', '東京', 65, 2019], 11 ['みかん', '東京', 53, 2018], 12 ['みかん', '東京', 73, 2017], 13 ['みかん', '大阪', 76, 2020], 14 ['みかん', '大阪', 58, 2019], 15 ['みかん', '大阪', 63, 2018], 16 ['みかん', '大阪', 52, 2017]], 17 columns=['果物', '都道府県', '値段', '年']) 18

ゴール

python

1#ゴール 2#2017年は前の年のデータがないためNaN 3 果物 都道府県 値段 年 結果 40 りんご 東京 157 2020 156.666667 51 りんご 東京 172 2019 149.000000 62 りんご 東京 146 2018 152.000000 73 りんご 東京 152 2017 NaN 84 りんご 大阪 135 2020 163.000000 95 りんご 大阪 165 2019 162.000000 106 りんご 大阪 148 2018 176.000000 117 りんご 大阪 176 2017 NaN 128 みかん 東京 82 2020 63.666667 139 みかん 東京 65 2019 63.000000 1410 みかん 東京 53 2018 73.000000 1511 みかん 東京 73 2017 NaN 1612 みかん 大阪 76 2020 57.666667 1713 みかん 大阪 58 2019 57.500000 1814 みかん 大阪 63 2018 52.000000 1915 みかん 大阪 52 2017 NaN

試したこと

for文で1行ずつ取り出しての実行はできたのですが、実際のデータは行数が多いため、このコードだと処理に時間がかかり過ぎてしまいます。

python

1for i in range(len(df)): 2 x = df[(df['果物'] == df.at[i, '果物']) & (df['都道府県'] == df.at[i, '都道府県']) & (df['年'] < df.at[i, '年'])]['値段'] 3 df.at[i, '結果'] = x.mean()

そこで**「処理をより高速に終わらせる方法」**を模索しています。

どうかご回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

前提条件

  • 同一条件(果物、都道府県、年)のデータが複数個存在していないこと。

groupby().apply() にて実装できます。

Python

1import pandas as pd 2 3df = pd.DataFrame([['りんご', '東京', 157, 2020], 4 ['りんご', '東京', 172, 2019], 5 ['りんご', '東京', 146, 2018], 6 ['りんご', '東京', 152, 2017], 7 ['りんご', '大阪', 135, 2020], 8 ['りんご', '大阪', 165, 2019], 9 ['りんご', '大阪', 148, 2018], 10 ['りんご', '大阪', 176, 2017], 11 ['みかん', '東京', 82, 2020], 12 ['みかん', '東京', 65, 2019], 13 ['みかん', '東京', 53, 2018], 14 ['みかん', '東京', 73, 2017], 15 ['みかん', '大阪', 76, 2020], 16 ['みかん', '大阪', 58, 2019], 17 ['みかん', '大阪', 63, 2018], 18 ['みかん', '大阪', 52, 2017]], 19 columns=['果物', '都道府県', '値段', '年']) 20 21def f(d): 22 tmp = d.sort_values('年').reset_index() 23 tmp['res'] = (tmp['値段'].cumsum() / (tmp.index + 1)).shift(1) 24 return tmp.set_index('index')['res'] 25 26df['結果'] = df.groupby(['果物', '都道府県'], group_keys=False).apply(f) 27print(df) 28# 果物 都道府県 値段 年 結果 29#0 りんご 東京 157 2020 156.666667 30#1 りんご 東京 172 2019 149.000000 31#2 りんご 東京 146 2018 152.000000 32#3 りんご 東京 152 2017 NaN 33#4 りんご 大阪 135 2020 163.000000 34#5 りんご 大阪 165 2019 162.000000 35#6 りんご 大阪 148 2018 176.000000 36#7 りんご 大阪 176 2017 NaN 37#8 みかん 東京 82 2020 63.666667 38#9 みかん 東京 65 2019 63.000000 39#10 みかん 東京 53 2018 73.000000 40#11 みかん 東京 73 2017 NaN 41#12 みかん 大阪 76 2020 57.666667 42#13 みかん 大阪 58 2019 57.500000 43#14 みかん 大阪 63 2018 52.000000 44#15 みかん 大阪 52 2017 NaN

投稿2020/05/01 00:50

magichan

総合スコア15898

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

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

mamepon

2020/05/01 05:00

神すぎます! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問