Pandas初心者です。
天気と湿度の関係を度数分布とヒストグラムで表そうとしています。
具体的には、下記の図の左側のデータから右側のような度数分布表を目指しています。
自分でも調べてみて、例えば「晴れ」の列のみの場合は、「晴れ」だけを抽出した別途dfを作成してmatplotlib.pyplot
で.hist
を使ってヒストグラムを書くことは出来ました。
しかし、実際に欲しいのは、「湿度が10%以上20%未満」の時に、「晴れ/曇り/雨」がそれぞれ何回出現するかというデータです。出来ましたら、それを使ってのヒストグラムの書き方もお教え頂ければ助かります。
どうか、よろしくお願いします。
[環境]
Mac Os Catalina
Python 3.8
Jupyter Notebook 6.0.1
pandas 0.25.1
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/15 07:59
回答2件
0
ベストアンサー
度数分布票の作成です。
まず元データの作成。
python
1import pandas as pd 2import io 3 4indata = '''天気 湿度 5晴れ 20% 6曇り 60% 7晴れ 0% 8曇り 10% 9曇り 60% 10曇り 25% 11雨 100% 12晴れ 15% 13曇り 70% 14雨 60%''' 15 16with io.StringIO(indata) as f: 17 df = pd.read_csv(f, sep=' +', engine='python') 18 19print(df)
実行結果
python
1... 2>>> print(df) 3 天気 湿度 40 晴れ 20% 51 曇り 60% 62 晴れ 0% 73 曇り 10% 84 曇り 60% 95 曇り 25% 106 雨 100% 117 晴れ 15% 128 曇り 70% 139 雨 60%
度数分布表の作成です。
python
1import pandas as pd 2import numpy as np 3 4def classify(row): 5 m = float(row['湿度'][:-1]) 6 level = int(m/10)*10 7 if level == 100: 8 level = 90 9 return f'{level}%-{level+10}%' 10 11df['範囲'] = df.apply(classify, axis=1) 12df2 = pd.concat([df, pd.get_dummies(df['天気'])], axis=1).drop(['天気','湿度'], axis=1) 13df3 = pd.pivot_table(df2, index='範囲', values=['晴れ', '曇り', '雨'], aggfunc=np.sum) 14 15df_i = pd.DataFrame({'範囲':[f'{i}%-{i+10}%' for i in range(0,100,10)]}) 16df4 = pd.merge(df_i, df3, on='範囲', how='outer').fillna(0).astype({'晴れ':int, '曇り':int, '雨':int}) 17print(df4)
実行結果
python
1>>> print(df4) 2 範囲 晴れ 曇り 雨 30 0%-10% 1 0 0 41 10%-20% 1 1 0 52 20%-30% 1 1 0 63 30%-40% 0 0 0 74 40%-50% 0 0 0 85 50%-60% 0 0 0 96 60%-70% 0 2 1 107 70%-80% 0 1 0 118 80%-90% 0 0 0 129 90%-100% 0 0 1
グラフの表示です。
python
1import matplotlib.pyplot as plt 2x_datas = [1, 2, 3, 4, 5,6 ,7, 8, 9, 10] 3fine = df4['晴れ'] 4cloudy= df4['曇り'] 5rain = df4['雨'] 6fig = plt.figure() 7ax = fig.add_subplot(1, 1, 1) 8ax.bar(x_datas, fine, label='晴れ') 9ax.bar(x_datas, cloudy, bottom=fine, label='曇り') 10ax.bar(x_datas, rain, bottom=cloudy, label='雨') 11plt.xticks(x_datas, df4['範囲']) 12plt.legend() 13plt.show()
投稿2021/02/15 13:34
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/16 01:38
2021/02/16 02:09
2021/02/16 13:07
2021/02/16 13:56
2021/02/17 01:49
2021/02/17 01:50
0
dfは下記とする。
天気 湿度 0 晴れ 20 1 晴れ 50 2 雨 90 3 曇り 70 4 晴れ 10 5 雨 60 6 雨 65 7 曇り 45 8 晴れ 30
python
1df1 = df[df['天気']=='晴れ'] 2y1, x1 = np.histogram(df1['湿度'], bins = 10, range=(0, 100)) 3df2 = df[df['天気']=='曇り'] 4y2, x2 = np.histogram(df2['湿度'], bins = 10, range=(0, 100)) 5df3 = df[df['天気']=='雨'] 6y3, x3 = np.histogram(df3['湿度'], bins = 10, range=(0, 100)) 7plt.bar(x1[1:] - 3, y1, width=3, label='晴れ') 8plt.bar(x2[1:], y2, width=3, label='曇り') 9plt.bar(x3[1:] + 3, y3, width=3, label='雨') 10plt.legend() 11plt.show()
投稿2021/02/15 11:48
編集2021/02/16 04:23総合スコア10736
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。