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

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

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

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

Python

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

pandas

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

Q&A

解決済

2回答

374閲覧

pandasで指定された営業IDと期間内ごとの売上順位が1位だった確率を代入したい

hp9100i

総合スコア4

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2022/08/21 01:23

実現したいこと

pythonのpandasでデータの集計をしています
indexに割り当てた営業IDごとに[売上順位]が1位だった確率を[過去TOP率]に代入したい
1列目はindexで営業IDになります

元データ
df =

date売上順位売上過去TOP率
004032021-06-121100NaN
051662021-06-12360NaN
026912021-06-12280NaN
007082021-06-12420NaN
004032021-06-15185NaN
007082021-06-15260NaN
026912021-06-15440NaN
051662021-06-15350NaN
051662021-07-10170NaN
026912021-07-10340NaN
004032021-07-10265NaN
007082021-09-13250NaN
004032021-09-13170NaN
026912021-09-13345NaN
004032021-12-28460NaN
051662021-12-28275NaN
007082021-12-281100NaN
026912021-12-28380NaN
007082021-02-08340NaN
051662021-02-08260NaN
004032021-02-08165NaN

想定する完成データ
df1 =

date売上順位売上過去TOP率
004032021-06-1211001
051662021-06-123600
026912021-06-122800
007082021-06-124200
004032021-06-151851
007082021-06-152600
026912021-06-154400
051662021-06-153500
051662021-07-101700
026912021-07-103400
004032021-07-102651
007082021-09-132500
004032021-09-131700.75
026912021-09-133450
004032021-12-284600.8
051662021-12-282750.25
007082021-12-2811000
026912021-12-283800
007082021-02-083400
051662021-02-082600
004032021-02-081650

[過去TOP率]には最初の[date]から各売上当日までの[date]でなく、1つ前までの[date]を参照して計算したい
例えば0043の2021-12-28の[過去TOP率]には2021-02-08から2021-12-28までの全期間ではなく1つ前の2021-09-13まで、2021-07-10の[過去TOP率]には2021-02-08から1つ前の2021-06-15までの1位だった確率を[過去TOP率]に代入したい

indexに割り当てた営業IDごとに[売上順位]が1位だった確率を[過去TOP率]に代入したいのですが当方の技量不足により以下の文を書いたところで行き詰まりました

eigyou_id_list = ['00403','05166','02691','00708'] target_df = df.loc[eigyou_id_list] df.loc[df['売上順位'] >= 2, '過去TOP率'] = 0 df.loc[df['売上順位'] == 1, '過去TOP率'] = 1 df['過去TOP率'] = target_df[target_df['date'] < date].sort_values('date', ascending=False).groupby(level=0)[['過去TOP率']].mean()

初心者で試したことも少ないのですが、よろしくお願いします

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

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

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

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

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

meg_

2022/08/21 03:37

> df.loc[df['売上順位'] >= 2, '過去TOP率'] = 0 > df.loc[df['売上順位'] == 1, '過去TOP率'] = 1 上記はやりたい事の一部でしょうか? 処理対象は'売上順位'が1のデータの営業IDの過去の売り上げ1位だった確率でしょうか?
guest

回答2

0

ベストアンサー

python

1dfg = df.reset_index() 2dfg['過去TOP率'] = \ 3 dfg.assign(v = dfg['売上順位'].where(dfg['売上順位'] == 1, 0))\ 4 .groupby('index', sort=False, group_keys=False)\ 5 .apply(lambda x: x.sort_values('date')['v'].cumsum().shift()/range(len(x)))\ 6 .fillna(0) 7df = dfg.set_index('index').rename_axis(None, axis=0) 8print(df)
date売上順位売上過去TOP率
004032021-06-1211001
051662021-06-123600
026912021-06-122800
007082021-06-124200
004032021-06-151851
007082021-06-152600
026912021-06-154400
051662021-06-153500
051662021-07-101700
026912021-07-103400
004032021-07-102651
007082021-09-132500
004032021-09-131700.75
026912021-09-133450
004032021-12-284600.8
051662021-12-282750.25
007082021-12-2811000
026912021-12-283800
007082021-02-083400
051662021-02-082600
004032021-02-081650

投稿2022/08/21 08:04

編集2022/08/21 08:09
melian

総合スコア19796

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

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

hp9100i

2022/08/21 13:49

ありがとうございます ものすごく助かりました
guest

0

下記dfは質問のindexを営業ID列としています。

Python

1for index, row in df.iterrows(): 2 temp_df = df[(df['date'] < row['date']) & (df['営業ID'] == row['営業ID'])] 3 count = len(temp_df) 4 one = len(temp_df[temp_df['売上順位'] == 1]) 5 if one > 0: 6 df.loc[index, '過去TOP率'] = one / count 7 8print(df) 9# 営業ID date 売上順位 売上 過去TOP率 10#0 00403 2021-06-12 1 100 1.00 11#1 05166 2021-06-12 3 60 NaN 12#2 02691 2021-06-12 2 80 NaN 13#3 00708 2021-06-12 4 20 NaN 14#4 00403 2021-06-15 1 85 1.00 15#5 00708 2021-06-15 2 60 NaN 16#6 02691 2021-06-15 4 40 NaN 17#7 05166 2021-06-15 3 50 NaN 18#8 05166 2021-07-10 1 70 NaN 19#9 02691 2021-07-10 3 40 NaN 20#10 00403 2021-07-10 2 65 1.00 21#11 00708 2021-09-13 2 50 NaN 22#12 00403 2021-09-13 1 70 0.75 23#13 02691 2021-09-13 3 45 NaN 24#14 00403 2021-12-28 4 60 0.80 25#15 05166 2021-12-28 2 75 0.25 26#16 00708 2021-12-28 1 100 NaN 27#17 02691 2021-12-28 3 80 NaN 28#18 0708 2021-02-08 3 40 NaN 29#19 05166 2021-02-08 2 60 NaN 30#20 00403 2021-02-08 1 65 NaN

投稿2022/08/21 04:19

meg_

総合スコア10580

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

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

hp9100i

2022/08/21 13:49

ありがとうございます ものすごく助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問