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

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

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

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

Q&A

解決済

2回答

807閲覧

[Python]エリア別、種別単位で重ねて折れ線グラフを出力したい

mango55

総合スコア22

Python 3.x

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

0グッド

0クリップ

投稿2023/02/21 02:59

編集2023/02/21 06:24

実現したいこと

下記のようなdataframeでエリア別、種別ごとにIDをカウントして重ねて折れ線グラフをエリア別にグラフを出力したいです

|ID|日付|種別|エリア| ←エリアを新規列
|1111|2022/1/1|新規|東京 |関東|
|2222|2022/1/1|新規|神奈川|関東|
|3333|2022/1/2|変更|大阪 |大阪|

発生している問題・エラーメッセージ

実現が上手く出来ず、ご指摘を頂きたいです。
pivotの後に日付をindexにする方法が分かりません。初歩的な質問で申し訳ありません。

該当のソースコード

Python

1 2import pandas as pd 3import numpy as np 4import matplotlib.pyplot as plt 5  6df_test = pd.DataFrame({'ID': [1111, 2222,  3333], 7                        '日付': ['2022/1/1', '2022/1/1', '2022/1/2'],  8                        '種別': ['新規', '新規', '変更'], 9                        '都道府県': ['東京', '神奈川', '大阪'], 10                        'エリア': ['関東', '関東', '大阪']}) 11df_test['日付'] = pd.to_datetime(df_test['日付']).dt.date 12  13areas = ['関東',  '関西'] 14shubetu = ['新規','変更','廃止'] 15  16for area in areas: 17    for shu in shubetu: 18        df_test2 = df_test[df_test['エリア']==area] 19        df_test2 = df_test[df_test['種別']==shu] 20         21        plt.title(area + '_' + shu) 22        flg = plt.figure() 23        ax = flg.add_subplot() 24        ax.plot(x, y) 25

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

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

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

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

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

iFQ7Vj

2023/02/21 03:13

コードのフォーマットが崩れているので修正していただけますか
melian

2023/02/21 03:14

日付の部分が文字列ではなく計算式になってしまっています。まずは以下の様に df_test を定義するとよいかと思います。 df_test = pd.DataFrame({'ID': [1111, 2222, 3333], '日付': ['2022/1/1', '2022/1/1', '2022/1/2'], '種別': ['新規', '新規', '変更'], '都道府県': ['東京', '神奈川', '大阪']}) df_test['日付'] = pd.to_datetime(df_test['日付'])
mango55

2023/02/21 03:17

すみません、今外で携帯から記載しておりご迷惑をお掛けしてすみません。すぐに修正致します。
melian

2023/02/21 03:35

> pivotの後に日付をindexにする方法 こちらに関しては以下の様にするとよいかと。 pivot = df_test.pivot_table(values='ID', index='日付', columns='種別', aggfunc=len, fill_value=0)
mango55

2023/02/21 03:48

ご回答ありがとうございます。 コメント頂いたようにし、その後 pivot.plot.line() とするとグラフエリア全面に色が塗られてしまいました。 これはpivotの影響でしょうか?
iFQ7Vj

2023/02/21 03:51 編集

> 下記のようなdataframeでエリア別、種別ごとにIDをカウントして重ねて折れ線グラフをエリア別にグラフを出力したいです すみません、どのようなグラフを出力したいのかよくわからないのですが、 縦軸(多分ID)、横軸の内容と何のグラフを出力したいのでしょうか
mango55

2023/02/21 03:53

分かりづらくて申し訳ありません。 エリア別に、x: 日付、y: IDの件数を種別毎(同グラフで重ねて)折れ線グラフを出力したい が目標です。よろしくお願い致します。
iFQ7Vj

2023/02/21 04:45 編集

すみません、データの内容が被っていたりでよくわからないのでグラフの各点の座標を具体的に書いていただけますか このデータだと (2021/1/1, 1111), (2021/1/1, 2222), (2021/1/2, 3333) となり、2021/1/1に1111と2222の両方が対応しているためプロットできません
mango55

2023/02/21 04:45

2021/1/1, 1111 新規 2021/1/1, 1111 変更 2021/1/2, 2222 新規 2021/1/2, 2222 新規 2021/1/2, 1111 新規 データは被りがあり、日別に顧客IDのようなイメージでそれに紐付く、種別が複数あるのでIDをカウントするような感じです。 伝わりますでしょうか?
iFQ7Vj

2023/02/21 04:58 編集

新規: (2021/1/1, 1111), (2021/1/2, 2222), (2021/1/2, 2222), (2021/1/2, 1111) 変更: (2021/1/1, 1111) ということでしょうか、この場合だと新規の1/2に1111と2222のどちらにプロットすれば良いかわかりませんが、 それとも 新規: (2021/1/1, 1), (2021/1/2, 3) 変更: (2021/1/1, 1), (2021/1/2, 0) のようにIDの数なのでしょうか
mango55

2023/02/21 05:02

IDの数をsumです。すみません
iFQ7Vj

2023/02/21 05:06

新規: (2021/1/1, 1), (2021/1/2, 4) 変更: (2021/1/1, 1), (2021/1/2, 1) ということですか
mango55

2023/02/21 06:29

ご回答ありがとうございます。 やりたいことが上手く伝えらず、申し訳ありません。 データ、コードを修正しました。 種別は同グラフでエリア毎には分けるイメージです。
mango55

2023/02/21 12:43

何度もすみません。あれから教えて頂いた方法で何度か試しているのですが、グラフがプロットされません。 原因が分からず、困っています。もし原因がお分かりでしたらご教授頂けないでしょうか。 pivot = df_s2.pivot_table(values = ['ID'], index = ['日付'],               columns = ['エリア','種別'], aggfunc = 'sum', fill_value = 0) output: | ID    | | エリア |関西|関西| | 種別 |新規|変更| | 日付 | |2022/01/01| 3 | 2 | areas = pivot.columns.levels[1] _, ax = plt.subplots(1, len(areas))  何度も本当にすみません。
guest

回答2

0

ベストアンサー

python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4from matplotlib import dates as mdates 5from matplotlib.ticker import MaxNLocator 6 7df_test = pd.DataFrame({'ID': [1111, 2222, 3333], 8 '日付': ['2022/1/1', '2022/1/1', '2022/1/2'], 9 '種別': ['新規', '新規', '変更'], 10 '都道府県': ['東京', '神奈川', '大阪'], 11 'エリア': ['関東', '関東', '大阪']}) 12df_test['日付'] = pd.to_datetime(df_test['日付']).dt.date 13 14pivot = df_test.pivot_table(values=['ID'], index=['日付'], columns=['エリア', '種別'], aggfunc='size') 15pivot = pivot.reindex(pd.MultiIndex.from_product(pivot.columns.levels), axis=1).fillna(0, downcast='infer') 16 17areas = pivot.columns.levels[0] 18_, ax = plt.subplots(1, len(areas)) 19for i, area in enumerate(areas): 20 pivot[area].plot.line(ax=ax[i]) 21 ax[i].set_title(area) 22 ax[i].xaxis.set_major_locator(mdates.DayLocator(range((pivot.index.max()-pivot.index.min()).days + 2))) 23 ax[i].xaxis.set_major_formatter(mdates.DateFormatter('%Y/%-m/%-d')) 24 ax[i].yaxis.set_major_locator(MaxNLocator(integer=True)) 25 26plt.tight_layout() 27plt.show()

イメージ説明

投稿2023/02/21 05:07

編集2023/02/21 07:08
melian

総合スコア19701

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

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

mango55

2023/02/21 06:27

ご回答ありがとうございます。 やりたいことが上手く伝えられておらず申し訳ありません。 コードの理解が難しかったのと、やりたかったことが少し異なっていたため、コードを修正しました。 種別は同グラフで、エリア毎に分けて表示したいがやりたいことです。よろしくお願いします。
melian

2023/02/21 07:03

こんな感じでしょうか。
mango55

2023/02/21 07:52

ご回答ありがとうございました。 上記参考に実データで修正して試しているのですが、上手く出来ないのでもう少し考えてみます。 ありがとうございました。
mango55

2023/02/21 09:35 編集

何度か出力を試みているのですが、エラー&実データが多いため、なかなか上手く出来ず確認中なのですが、下記で出力を確認した時の表示の意味が分からないので教えて頂きたいです。 print(ax[i].set_title(area)) →Text(0.5, 1.0, ‘関西’)
melian

2023/02/21 09:39

0.5 と 1.0 は ax 上の座標です。その座標に「関西」というタイトルを表示します。
mango55

2023/02/21 10:22

お返事ありがとうございます。 あとやはり教えて頂いた方法ですと、実データで意図した形で出力できないので、コード欄に記載したforのやり方でのご指摘をお願いできないでしょうか。 お手数をお掛けして申し訳ありません。
mango55

2023/02/21 13:09

何度もすみません。あれから教えて頂いた方法で何度か試しているのですが、グラフがプロットされません。 原因が分からず、困っています。もし原因がお分かりでしたらご教授頂けないでしょうか。 pivot = df_s2.pivot_table(values = ['ID'], index = ['日付'], columns = ['エリア','種別'], aggfunc = 'sum', fill_value = 0) output: | ID    | | エリア |関西|関西| | 種別 |新規|変更| | 日付 | |2022/01/01| 3 | 2 | areas = pivot.columns.levels[1] _, ax = plt.subplots(1, len(areas)) 何度も本当にすみません。
mango55

2023/02/22 02:29

何とか出力出来ました。 ですが、複数のグラフがタイトに出力されてしまう、折れ線になっていない問題があり解決したいです。 グラフは縦一列に並べようと fig = ply.figure(figsize=(1,1)) と追記しましたが解決しませんでした。 こちらの解決方法がありましたらご教示お願いします。
guest

0

pandasは使ったことがないのですが、このような感じでしょうか
グラフ化はしていませんが

python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4 5areas = ['関東', '関西', '大阪'] 6df_test['エリア'] = areas 7 8df_test = pd.DataFrame({ 9 'ID': [1111, 2222, 3333], 10 '日付': ['2022/1/1', '2022/1/1', '2022/1/2'], 11 '種別': ['新規', '新規', '変更'], 12 '都道府県': ['東京', '神奈川', '大阪'], 13}) 14 15 16pivot = df_test.pivot_table( 17 values = ['ID'], 18 index = ['日付'], 19 columns = ['種別'], 20 aggfunc = 'sum', 21).reset_index() 22 23print(df_test) 24

投稿2023/02/21 03:42

編集2023/02/21 05:11
iFQ7Vj

総合スコア52

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

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

mango55

2023/02/21 03:50

コメントありがとうございます。 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問