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

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

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

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

Q&A

解決済

2回答

512閲覧

時系列データの条件別抽出

mamepon

総合スコア5

Python

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

1グッド

0クリップ

投稿2022/04/25 04:49

編集2022/04/25 12:13

時系列データの条件別抽出

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

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

今回行いたいことは以下の4つのステップです。
(別に以下のステップでなくても目標物が得られれば問題はありません)

①『場所_お店』の全てのパターンで列を作成
(東京_スーパー、東京_コンビニ、大阪_スーパー、大阪_コンビニ)

②値段をその行より前の年、かつ、同一果物のデータを抽出
(最初の行は 果物:りんご 、年:2022 なのでりんごの2021-2019年までを抽出)

③②で抽出した値段を『場所』と『お店』で分類してその平均値を算出
(最初の行の場合、りんごの2021-2019を抽出してきているので、その値を 東京_スーパー、東京_コンビニ、大阪_スーパー、大阪_コンビニ の組み合わせで平均値を算出)

④該当する列に平均値を出力
(最初の行では、③で算出した4パターンの値を①で作成した東京_スーパー、東京_コンビニ、大阪_スーパー、大阪_コンビニの列にそれぞれ出力)

以下が使用するデータと、目標物になります。

目標物は自分で計算し、手入力で作成しました。

データ

python

1df = pd.DataFrame([['りんご', '東京', 'スーパー',157, 2022], 2 ['りんご', '東京', 'スーパー',172, 2021], 3 ['りんご', '東京', 'スーパー',146, 2020], 4 ['りんご', '東京', 'スーパー',152, 2019], 5 ['りんご', '東京', 'コンビニ',135, 2022], 6 ['りんご', '東京', 'コンビニ',165, 2021], 7 ['りんご', '東京', 'コンビニ',148, 2020], 8 ['りんご', '東京', 'コンビニ',176, 2019], 9 ['りんご', '大阪', 'スーパー',182, 2022], 10 ['りんご', '大阪', 'スーパー',165, 2021], 11 ['りんご', '大阪', 'スーパー',153, 2020], 12 ['りんご', '大阪', 'スーパー',173, 2019], 13 ['りんご', '大阪', 'コンビニ',176, 2022], 14 ['りんご', '大阪', 'コンビニ',158, 2021], 15 ['りんご', '大阪', 'コンビニ',163, 2020], 16 ['りんご', '大阪', 'コンビニ',152, 2019], 17 ['みかん', '東京', 'スーパー',157, 2022], 18 ['みかん', '東京', 'スーパー',172, 2021], 19 ['みかん', '東京', 'スーパー',146, 2020], 20 ['みかん', '東京', 'スーパー',112, 2019], 21 ['みかん', '東京', 'コンビニ',135, 2022], 22 ['みかん', '東京', 'コンビニ',165, 2021], 23 ['みかん', '東京', 'コンビニ',148, 2020], 24 ['みかん', '東京', 'コンビニ',146, 2019], 25 ['みかん', '大阪', 'スーパー',182, 2022], 26 ['みかん', '大阪', 'スーパー',165, 2021], 27 ['みかん', '大阪', 'スーパー',153, 2020], 28 ['みかん', '大阪', 'スーパー',143, 2019], 29 ['みかん', '大阪', 'コンビニ',176, 2022], 30 ['みかん', '大阪', 'コンビニ',158, 2021], 31 ['みかん', '大阪', 'コンビニ',163, 2020], 32 ['みかん', '大阪', 'コンビニ',122, 2019]], 33 columns=['果物', '都道府県', 'お店', '値段', '年'])

目標物

python

1#目標物 2 果物 都道府県 お店 値段 年 東京_スーパー 東京_コンビニ 大阪_スーパー 大阪_コンビニ  30 りんご 東京 スーパー 157 2022 156.666667 163.000000  163.666667 157.666667 41 りんご 東京 スーパー 172 2021 149.000000 162.000000  163.000000 157.500000 52 りんご 東京 スーパー 146 2020 152.000000 176.000000  173.000000 152.000000 63 りんご 東京 スーパー 152 2019 NaN NaN  NaN  NaN 74 りんご 東京 コンビニ 135 2022 156.666667 163.000000  163.666667 157.666667 85 りんご 東京 コンビニ 165 2021 149.000000 162.000000  163.000000 157.500000 96 りんご 東京 コンビニ 148 2020 152.000000 176.000000  173.000000 152.000000 107 りんご 東京 コンビニ 176 2019 NaN NaN  NaN  NaN 118 りんご 大阪 スーパー 182 2022 156.666667 163.000000  163.666667 157.666667 129 りんご 大阪 スーパー 165 2021 149.000000 162.000000  163.000000 157.500000 1310 りんご 大阪 スーパー 153 2020 152.000000 176.000000  173.000000 152.000000 1411 りんご 大阪 スーパー 173 2019 NaN NaN  NaN  NaN 1512 りんご 大阪 コンビニ 176 2022 156.666667 163.000000  163.666667 157.666667 1613 りんご 大阪 コンビニ 158 2021 149.000000 162.000000  163.000000 157.500000 1714 りんご 大阪 コンビニ 163 2020 152.000000 176.000000  173.000000 152.000000 1815 りんご 大阪 コンビニ 152 2019 NaN NaN  NaN  NaN 1916 みかん 東京 スーパー 157 2022 143.333333 153.000000  153.666667 147.666667 2017 みかん 東京 スーパー 172 2021 129.000000 147.000000  148.000000 142.500000 2118 みかん 東京 スーパー 146 2020 112.000000 146.000000  143.000000 122.000000 2219 みかん 東京 スーパー 112 2019 NaN NaN  NaN  NaN 2320 みかん 東京 コンビニ 135 2022 143.333333 153.000000  153.666667 147.666667 2421 みかん 東京 コンビニ 165 2021 129.000000 147.000000  148.000000 142.500000 2522 みかん 東京 コンビニ 148 2020 112.000000 146.000000  143.000000 122.000000 2623 みかん 東京 コンビニ 146 2019 NaN NaN  NaN  NaN 2724 みかん 大阪 スーパー 182 2022 143.333333 153.000000  153.666667 147.666667 2825 みかん 大阪 スーパー 165 2021 129.000000 147.000000  148.000000 142.500000 2926 みかん 大阪 スーパー 153 2020 112.000000 146.000000  143.000000 122.000000 3027 みかん 大阪 スーパー 143 2019 NaN NaN  NaN  NaN 3128 みかん 大阪 コンビニ 176 2022 143.333333 153.000000  153.666667 147.666667 3229 みかん 大阪 コンビニ 158 2021 129.000000 147.000000  148.000000 142.500000 3330 みかん 大阪 コンビニ 163 2020 112.000000 146.000000  143.000000 122.000000 3431 みかん 大阪 コンビニ 122 2019 NaN NaN  NaN  NaN 35

この目標物を得られるコードを書こうと試みているのですが、上手く書けず困っています。
どなたか教えていただけないでしょうか。
どうかご回答よろしくお願いします。

退会済みユーザー👍を押しています

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

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

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

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

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

TakaiY

2022/04/25 11:05

質問は何ですか?
guest

回答2

0

ベストアンサー

python

1dfx = ( 2 df.groupby(['果物', '都道府県', 'お店'], sort=False) 3 .apply(lambda x: 4 x[['年', '値段']] 5 .set_index('年').sort_index() 6 .shift().expanding().mean() 7 .sort_index(ascending=False) 8 .rename(columns={ 9 '値段': f'{x["都道府県"].values[0]}_{x["お店"].values[0]}'}))) 10 11dfx = dfx.unstack().ffill().bfill().stack(dropna=False) 12dfx = pd.concat([df, dfx.reset_index(drop=True)], axis=1) 13print(dfx) 14 15# 16 果物 都道府県 お店 値段 年 東京_スーパー 東京_コンビニ 大阪_スーパー 大阪_コンビニ 170 りんご 東京 スーパー 157 2022 156.666667 163.0 163.666667 157.666667 181 りんご 東京 スーパー 172 2021 149.000000 162.0 163.000000 157.500000 192 りんご 東京 スーパー 146 2020 152.000000 176.0 173.000000 152.000000 203 りんご 東京 スーパー 152 2019 NaN NaN NaN NaN 214 りんご 東京 コンビニ 135 2022 156.666667 163.0 163.666667 157.666667 225 りんご 東京 コンビニ 165 2021 149.000000 162.0 163.000000 157.500000 236 りんご 東京 コンビニ 148 2020 152.000000 176.0 173.000000 152.000000 247 りんご 東京 コンビニ 176 2019 NaN NaN NaN NaN 258 りんご 大阪 スーパー 182 2022 156.666667 163.0 163.666667 157.666667 269 りんご 大阪 スーパー 165 2021 149.000000 162.0 163.000000 157.500000 2710 りんご 大阪 スーパー 153 2020 152.000000 176.0 173.000000 152.000000 2811 りんご 大阪 スーパー 173 2019 NaN NaN NaN NaN 2912 りんご 大阪 コンビニ 176 2022 156.666667 163.0 163.666667 157.666667 3013 りんご 大阪 コンビニ 158 2021 149.000000 162.0 163.000000 157.500000 3114 りんご 大阪 コンビニ 163 2020 152.000000 176.0 173.000000 152.000000 3215 りんご 大阪 コンビニ 152 2019 NaN NaN NaN NaN 3316 みかん 東京 スーパー 157 2022 143.333333 163.0 163.666667 157.666667 3417 みかん 東京 スーパー 172 2021 129.000000 162.0 163.000000 157.500000 3518 みかん 東京 スーパー 146 2020 112.000000 176.0 173.000000 152.000000 3619 みかん 東京 スーパー 112 2019 NaN NaN NaN NaN 3720 みかん 東京 コンビニ 135 2022 143.333333 153.0 163.666667 157.666667 3821 みかん 東京 コンビニ 165 2021 129.000000 147.0 163.000000 157.500000 3922 みかん 東京 コンビニ 148 2020 112.000000 146.0 173.000000 152.000000 4023 みかん 東京 コンビニ 146 2019 NaN NaN NaN NaN 4124 みかん 大阪 スーパー 182 2022 143.333333 153.0 153.666667 157.666667 4225 みかん 大阪 スーパー 165 2021 129.000000 147.0 148.000000 157.500000 4326 みかん 大阪 スーパー 153 2020 112.000000 146.0 143.000000 152.000000 4427 みかん 大阪 スーパー 143 2019 NaN NaN NaN NaN 4528 みかん 大阪 コンビニ 176 2022 143.333333 153.0 153.666667 147.666667 4629 みかん 大阪 コンビニ 158 2021 129.000000 147.0 148.000000 142.500000 4730 みかん 大阪 コンビニ 163 2020 112.000000 146.0 143.000000 122.000000 4831 みかん 大阪 コンビニ 122 2019 NaN NaN NaN NaN

投稿2022/04/25 12:36

編集2022/04/25 13:24
melian

総合スコア19798

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

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

mamepon

2022/04/25 12:56

回答ありがとうございます! ただ確かに奇妙な形式ではあると思うのですが、上記の目標物のようにすることはできないでしょうか! 図々しくて本当にすみません!
melian

2022/04/25 13:03

はい、それでは少し考えてみます。
melian

2022/04/25 13:25

書き換えてみました。色々と問題があるかもしれませんが、試してみて下さい。
mamepon

2022/04/25 13:30

ちゃんと動いています!感動です! 本当にありがとうございました!
guest

0

import pandas as pd
df = pd.DataFrame([['りんご', '東京', 'スーパー',157, 2022],
['りんご', '東京', 'スーパー',172, 2021],
['りんご', '東京', 'スーパー',146, 2020],
['りんご', '東京', 'スーパー',152, 2019],
['りんご', '東京', 'コンビニ',135, 2022],
['りんご', '東京', 'コンビニ',165, 2021],
['りんご', '東京', 'コンビニ',148, 2020],
['りんご', '東京', 'コンビニ',176, 2019],
['りんご', '大阪', 'スーパー',182, 2022],
['りんご', '大阪', 'スーパー',165, 2021],
['りんご', '大阪', 'スーパー',153, 2020],
['りんご', '大阪', 'スーパー',173, 2019],
['りんご', '大阪', 'コンビニ',176, 2022],
['りんご', '大阪', 'コンビニ',158, 2021],
['りんご', '大阪', 'コンビニ',163, 2020],
['りんご', '大阪', 'コンビニ',152, 2019],
['みかん', '東京', 'スーパー',157, 2022],
['みかん', '東京', 'スーパー',172, 2021],
['みかん', '東京', 'スーパー',146, 2020],
['みかん', '東京', 'スーパー',112, 2019],
['みかん', '東京', 'コンビニ',135, 2022],
['みかん', '東京', 'コンビニ',165, 2021],
['みかん', '東京', 'コンビニ',148, 2020],
['みかん', '東京', 'コンビニ',146, 2019],
['みかん', '大阪', 'スーパー',182, 2022],
['みかん', '大阪', 'スーパー',165, 2021],
['みかん', '大阪', 'スーパー',153, 2020],
['みかん', '大阪', 'スーパー',143, 2019],
['みかん', '大阪', 'コンビニ',176, 2022],
['みかん', '大阪', 'コンビニ',158, 2021],
['みかん', '大阪', 'コンビニ',163, 2020],
['みかん', '大阪', 'コンビニ',122, 2019]],
columns=['果物', '都道府県', 'お店', '値段', '年'])

#データの列数取得
columns_num = len(df.columns)

#都道府県の重複排除
df_t=df['都道府県'].drop_duplicates().reset_index(drop=True)

#お店の重複排除
df_o=df['お店'].drop_duplicates().reset_index(drop=True)

#場所_お店
basyo_omise_num=0
list_to = []
for i in range(len(df_t)):
for k in range(len(df_o)):
list_to = list_to + [df_t[i]+'_'+df_o[k]]
basyo_omise_num = basyo_omise_num +1

#①『場所_お店』の全てのパターンで列を作成
for i in range(len(list_to)):
df[list_to[i]] = 0

#自身追加
df['自身']=df['都道府県']+'_'+df['お店']

for i in range(len(df)):
for k in range(basyo_omise_num):
df.iat[i,columns_num+k]=df[(df['年']<df.iat[i,4])&(df['果物']==df.iat[i,0])&(df['自身']==list_to[k])]['値段'].mean()

df=df.drop(columns='自身')

print(df)

投稿2022/04/25 11:53

aga_mk

総合スコア5

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

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

mamepon

2022/04/25 12:59

回答ありがとうございます! 実は実際のデータがかなり膨大であるため、for文を使わない実装を目指しています! 回答していただいたのにも関わらず、ベストアンサーにできず、すみません!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問