実現したいこと
下記のような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
コードのフォーマットが崩れているので修正していただけますか
日付の部分が文字列ではなく計算式になってしまっています。まずは以下の様に 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['日付'])
すみません、今外で携帯から記載しておりご迷惑をお掛けしてすみません。すぐに修正致します。
> pivotの後に日付をindexにする方法
こちらに関しては以下の様にするとよいかと。
pivot = df_test.pivot_table(values='ID', index='日付', columns='種別', aggfunc=len, fill_value=0)
ご回答ありがとうございます。
コメント頂いたようにし、その後
pivot.plot.line()
とするとグラフエリア全面に色が塗られてしまいました。
これはpivotの影響でしょうか?
> 下記のようなdataframeでエリア別、種別ごとにIDをカウントして重ねて折れ線グラフをエリア別にグラフを出力したいです
すみません、どのようなグラフを出力したいのかよくわからないのですが、
縦軸(多分ID)、横軸の内容と何のグラフを出力したいのでしょうか
分かりづらくて申し訳ありません。
エリア別に、x: 日付、y: IDの件数を種別毎(同グラフで重ねて)折れ線グラフを出力したい
が目標です。よろしくお願い致します。
すみません、データの内容が被っていたりでよくわからないのでグラフの各点の座標を具体的に書いていただけますか
このデータだと (2021/1/1, 1111), (2021/1/1, 2222), (2021/1/2, 3333)
となり、2021/1/1に1111と2222の両方が対応しているためプロットできません
2021/1/1, 1111 新規
2021/1/1, 1111 変更
2021/1/2, 2222 新規
2021/1/2, 2222 新規
2021/1/2, 1111 新規
データは被りがあり、日別に顧客IDのようなイメージでそれに紐付く、種別が複数あるのでIDをカウントするような感じです。
伝わりますでしょうか?
新規: (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の数なのでしょうか
IDの数をsumです。すみません
新規: (2021/1/1, 1), (2021/1/2, 4)
変更: (2021/1/1, 1), (2021/1/2, 1)
ということですか
ご回答ありがとうございます。
やりたいことが上手く伝えらず、申し訳ありません。
データ、コードを修正しました。
種別は同グラフでエリア毎には分けるイメージです。
何度もすみません。あれから教えて頂いた方法で何度か試しているのですが、グラフがプロットされません。
原因が分からず、困っています。もし原因がお分かりでしたらご教授頂けないでしょうか。
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))
何度も本当にすみません。

回答2件
あなたの回答
tips
プレビュー