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

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

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

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

pandas

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

Q&A

解決済

2回答

541閲覧

pandasのpivot_tableをした結果のカラムの四半期から製品のシェアを出したい

onosan

総合スコア62

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2020/04/11 13:58

縦持ちしていた数量のデータに対してQ1,Q2のように四半期をつけた結果をpivot_tableでピボットした結果、以下のような結果を得たとします。

Q    Q1          Q2          Q3
製品   製品A 製品B 製品C 製品A 製品B 製品C 製品A 製品B 製品C
施設A  100  200  300  100  250  400  100  200 200 
施設B  150  250  350  150  200  450  150  260 300

この時
(1) Qごとの製品Aのシェアを算出する方法
(2) Qの中で最もシェアが高い製品を特定し、その製品のシェアを出す

という算出の必要が出ました。
当方、Pythonについて、まだ初心者で、いろいろと調べたのですが、方法が
見つかりませんでした。
ご教示いただけますと幸いです。
よろしくお願い申し上げます。

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

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

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

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

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

meg_

2020/04/12 11:01

・質問の表はpandasのDataFrameですか? 検証できないので元のデータサンプルとピボットしたコードも掲載してください。 ・「いろいろと調べたのですが、方法が見つかりませんでした。」とのことですが、何をどのように調べましたか? ヒントすらも見つからなかったのでしょうか?
onosan

2020/04/12 14:00

サジェスチョンありがとうございます。実際のデータが商用の二次データで、版権の問題があったため、少し問題を簡単にするためにデータフレームのイメージを描きました。調べ方はpandas ,pivot_table, シェアを求める などでググリました。自分なりに考えて、少し見えてきた兆しはあります。 pivotを行ったイメージは伝わらないかもしれませんが、 cym_pivot1 = pd.pivot_table(cym_all, index=['DDDブリック名'], columns=['Qフラグ','製品グループ2'], values=['PAT'],aggfunc=sum) です。
meg_

2020/04/12 14:55

データはサンプルデータで良いのですよ。実際にコードを動かさないと何とも言えないので。 シェアを計算するのならピボットにする必要もないのでは?と思ったので元のデータがあれば何か分かるかと思ったのですが。「少し見えてきた兆しはあり」とのことなので頑張ってください。
onosan

2020/04/18 04:46 編集

すみません。やはりいろいろと考えたのですが、結果の出し方がわかりません。 例えば、以下のようなデータがあったとします。 brick_id| Qフラグ| product| pat_x |pat_y |シェア 1012416| FY19-1Q |サインバルタ計| 14119.00739| 14583.64342| |0.96814 1012416| FY19-1Q| リリカ| 464.636035| 14583.64342 |0.03186 1012416| FY19-2Q| サインバルタ計| 13897.32032 |14207.07768 |0.978197 1012416| FY19-2Q |リリカ| 309.757356| 14207.07768| 0.021803 1012416 |FY20-1Q| サインバルタ計| 13253.45632 |14234.35461| 0.931089 というデータがあった際に、brick_idとQフラグ毎に、最大のシェアと最大シェアを持つproductを出した表を出すためにはどうすればよろしいでしょうか。 データをきれいに見せられなくてすみません。 やはり一旦、ロング型にしたほうが良いでしょうか。 よろしくお願い申し上げます。
guest

回答2

0

ベストアンサー

追加の質問に対する回答です。

例えば、以下のようなデータがあったとします。 brick_id| Qフラグ| product| pat_x |pat_y |シェア 1012416| FY19-1Q |サインバルタ計| 14119.00739| 14583.64342| |0.96814 1012416| FY19-1Q| リリカ| 464.636035| 14583.64342 |0.03186 1012416| FY19-2Q| サインバルタ計| 13897.32032 |14207.07768 |0.978197 1012416| FY19-2Q |リリカ| 309.757356| 14207.07768| 0.021803 1012416 |FY20-1Q| サインバルタ計| 13253.45632 |14234.35461| 0.931089

シェアが最大の行のproductを「brick_id、Qフラグ毎に」抽出します。

Python

1df = df[['brick_id','Qフラグ','product','シェア']] 2df2 = df.groupby(['brick_id','Qフラグ']) 3maxindex = df2['シェア'].idxmax().values.tolist() 4 5df3 = df.loc[maxindex, :]) 6print(df3) 7# brick_id Qフラグ product シェア 8#0 1012416 FY19-1Q サインバルタ計 0.968140 9#2 1012416 FY19-2Q サインバルタ計 0.978197 10#4 1012416 FY20-1Q サインバルタ計 0.931089

投稿2020/04/18 05:59

meg_

総合スコア10760

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

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

onosan

2020/04/18 06:38

ありがとうございます。だいぶ時間がかかっていたのですが、氷解しました。 すばらしい!ありがとうございます!! もしよろしければなのですが、普通に本で勉強していてもこのような方法が思いつかないのですが、どのように勉強されているのかご教示いただけますと幸いです。
meg_

2020/04/18 06:47

何もかも覚えるのは不可能なので、分からないことは大抵ネット検索で解決してますね。 場合によっては日本語での情報が不足していることもあるので、stackoverflowなどにお世話になっています。そして、得たヒントを基に自分の開発環境でトライ&エラー(まずは最小のコードから)を繰り返していけば身についていくかと思います。
onosan

2020/04/18 07:00

ありがとうございます。ひょっとしたらこの件でお聞きすることもあるかもしれませんが、取り急ぎ、本当に助かりました!
onosan

2020/04/18 09:10

meg_様 既に、問題は解決しているのですが、もう1つだけ甘えさせていただいてよろしいでしょうか。 実は、これをイメージ的には、 df4 = pd.pivot_table(df3, index=['brick_id'], columns=['Qフラグ'],values=['product','シェア'] のようなイメージで、四半期ごとの最大シェアと最大シェア品目を横持ちさせたいのですが、当然、最大シェア品目は、数値ではないので、valuesに入りません。columnsにいれると複数の製品が入ってしまいます。indexにいれると、四半期をまたいで、複数製品がでてしまう場合、製品が縦持ちになってしまいます。 製品を四半期別に横持ちにするにはどうすればよいでしょうか。 本当に手間がかかるやつですみません。 よろしかったらご協力いただけますと幸いです。
meg_

2020/04/18 11:59

onosanさんの頭の中ではイメージが出来ているのでしょうが、言葉の説明だけでは私には伝わってきません。(何となくは伝わりますが、コードを作成するには理解が必要ですので) 新しく質問を立てて、現状のデータフレームと目標とするデータフレームについて視覚的に判るようにした方が回答がつくかと思います。
onosan

2020/04/18 12:02

ありがとうございます。たしかに分かりにくいですね。ありがとうございます。新しい質問を立てたいと思います。本当にありがとうございました。
guest

0

pivot_table() にて得られたDataFrameを

Python

1df.stack().groupby(level=1).sum()

のように変形することで、各四半期毎の各製品のシェアを求めることができます。(シェアは全施設の合計から算出)
あとは idxmax() を使用することで一番シェアが高い製品を求めることあできるかと思います。

Pthon

1import pandas as pd 2 3idx = pd.MultiIndex.from_product( 4 [['Q1','Q2','Q3'],['製品A','製品B','製品C']]) 5df = pd.DataFrame([[100,200,300,100,250,400,100,200,200], 6 [150,250,350,150,200,450,150,260,300]], 7 columns=idx, index=['施設A','施設B']) 8print(df) 9# Q1 Q2 Q3 10# 製品A 製品B 製品C 製品A 製品B 製品C 製品A 製品B 製品C 11#施設A 100 200 300 100 250 400 100 200 200 12#施設B 150 250 350 150 200 450 150 260 300 13 14tmp = df.stack().groupby(level=1).sum() 15tmp = tmp / tmp.sum() 16print(tmp) 17# Q1 Q2 Q3 18#製品A 0.185185 0.161290 0.206612 19#製品B 0.333333 0.290323 0.380165 20#製品C 0.481481 0.548387 0.413223 21 22ret = pd.concat([tmp.idxmax().rename('製品名'), tmp.max().rename('シェア')], axis=1) 23print(ret) 24# 製品名 シェア 25#Q1 製品C 0.481481 26#Q2 製品C 0.548387 27#Q3 製品C 0.413223

投稿2020/04/13 07:13

magichan

総合スコア15898

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

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

onosan

2020/04/13 09:45

magichan様 ご回答いただき、ありがとうございます。 視界が広がった感じがします。 こちらなのですが、施設毎に出そうと思ったらどうすればよろしいでしょうか。少し自分で調べたのですが、わかりませんでした。 ご教示いただけますと大変助かります。 なにとぞ、よろしくお願い申し上げます。
magichan

2020/04/13 10:22

本当であれば pivot_table を作り直すのが早いのですが、現状のコードのままで実装するとすると、 tmp = df.stack().groupby(level=1).sum() の部分を tmp = df.stack(level=0).T のように直すと、とりあえず対応できると思います。
onosan

2020/04/13 12:08

ご回答いただき、ありがとうございます。確かに医療機関が見れるようになりました。感謝いたします。ただ、医療機関と四半期で医薬品Aのシェアと、医療機関と四半期での最大のシェアの医薬品とそのシェアを出すという問題が自分の力量ではまだ解けず、もう少し頑張ってみます。四半期とは別に年月でも同様のことをしないといけないために、汎用性の高い方法を模索しております。見たことがないやり方をされているので相当お詳しい方と推察しております。 またお聞きするかもしれませんが、その際はよろしくお願いいたします。 答えが出た段階でベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問