Python:Excelファイルからの読み込み
Excelファイルがたくさんあるとき、それを次々に読み込んで1つのDataFrameに集約します。
東京消防庁にある熱中症搬送者数データは、都道府県別・症状別・年齢別・発症場所別など、データはとても充実しています。
夏だけのデータですが、年度ごとにファイルが分かれていて、月ごとにシートが分かれています。
https://www.fdma.go.jp/disaster/heatstroke/post4.html
さらに、年によって収録されている月の数、つまりシートの枚数がことなります。最大は5月から9月までに5枚
このデータは都道府県別にデイリィ。都道府県は、コードで記載されています。
このデータから東京のデータを抜き出し、東京の1ヶ月分の合計搬送者数を求めます。
ファイル名は以下のとおり
ファイル名をリストにしておく
各ファイルについて以下の処理を行う
ファイルをシート1枚ずつ読み込む(最大5枚)
シートが不足してエラーになったらBreak
DataFrameに追加する
東京都だけ抜き出す
年月ごとに合計を求める
CSVファイルに出力する
(1)ファイル名のリスト
有難い事にファイル名が規則的でしたので、プログラムでリストを作成することができました。
filename = []
for i in range(20 , 31) :
s = 'heatstroke003_data_h'+str(i)+'.xlsx'
filename.append(s)
for i in range(1 , 5) :
s = 'heatstroke003_data_r'+str(i)+'.xlsx'
filename.append(s)
(2)Excelから読み込むには、ファイル名とシート名(またはシート番号)を指定します。
data = pd.read_excel('/content/'+name , sheet_name=[0])
ただし、nameにはファイル名が保存されているものとする。
シート番号は0から始まる連番(マクロVBAでは1からですが、Pythonは0発進)で指定することができます。
sheet_name = [0 , 1, 2 , 3, 4 ]
のように指定できますが、ここでは、ファイルによって枚数が異なるので、1枚ずつ読み込むことにします。
1枚ずつ5回読み込みますが、シートの枚数はファイルによって異なり、足りないファイルではエラーになります。エラーになったら、終了します。
「エラーになったら」の部分をtry〜except構文を利用します
for i in range(5) :
try :
print(i)
data = pd.read_excel('/content/'+name , sheet_name=[i])
except :
#print('error')
break
ファイルを読み込んだdataは辞書になります
キーはシート番号
値は、DataFrameです
辞書の要素は1個しかない(1シートずつ読み込むため)けれど、キーが毎回ことなるので、for文でキーと値を取り出します。
値はDataFrame型なので、これをdfに次々に追加していきます
以上を関数にしておき、引数としてdfとファイル名を受け取って、新しいdf を返します
def one_file(name , df) :
print(name)
for i in range(5) :
try :
print(i)
data = pd.read_excel('/content/'+name , sheet_name=[i])
#print('input OK')
for j , one in data.items() :
df = pd.concat([df , one])
except :
#print('error')
break
return df
(3)全体処理
ファイル名リストから1つずつ取り出して、関数を呼び出します
df = pd.DataFrame()
for one in filename :
df = one_file(one , df)
これで全部のデータがdfに読み込まれました。
(4)東京だけとりだす
東京の都道府県番号は13なので、
df13 = df[df['都道府県コード'] == 13]
(5)月ごとの合計を求める
groupbyを利用しますが、年月日から年と月だけを取り出して、1ヶ月分が同じになるようにします。
year_month = df13['日付'].dt.strftime('%Y-%m')
year_monthはシリーズです
※ df['年月'] = df13['日付'].dt.strftime('%Y-%m')
のようにいきなりdfの列としようとするとエラーが発生する
求めた「年月」と搬送者数だけで構成された新たなDataFrameを形成しようと思います。(余計な列がたくさんあるので)
df1 = pd.concat([year_month , df13['搬送人員(計)'] ] , axis=1)
df1.head()
df_day = df1.groupby('日付').sum()
同じ日付を集めて、合計を出します
(6)ファイル保存
df_day.to_csv('東京都熱中症搬送者数day.csv')
該当する月のアイスクリームの消費金額との関係を求めてみた
アイスを食べたら、搬送者数が増えるか、と言ったら、そんなことはないですね
これは、平均気温が間に介在しています。このような因果関係に見えることを擬似相関といいます