エクセルやCSVファイルからデータを取り出し、それを整理する必要がある場面は多々あります。Pandasは、データ整理と分析に非常に強力なツールであり、Pythonのライブラリとして提供されています。この記事では、Pandasを使用してデータを読み込み、整理する方法を詳しく説明します。
当記事では最低限の解説のみ記していますが、読むのが面倒な方は記事の最後には、データを簡単にグラフで可視化するためのコードがまとめてあります。これをコピーして実行するだけで、Pythonでのデータ可視化を試すことができます。手軽に実践してみたい方はまとめまで飛んでください。
データの読み込み
当記事ではGoogle Colabを使用します。
今回使用するエクセルファイルはこちらからダウンロードしてください。
ダウンロードしたエクセルファイルをコードファイルと同じフォルダに配置してください。
Google Driveをマウント
はじめにGoogle Driveをマウントします。
from google.colab import drive
drive.mount('/content/drive')
ライブラリをインポート
続いて、必要なライブラリをインポートします。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
エクセルファイルを読み込む
dfという変数にエクセルファイルのデータをデータフレーム形式で格納します。
# パス定義
DIR = "drive/My Drive/python/"
filename = DIR + "complex_data.xlsx"
# エクセルファイルからデータを読み込む
df = pd.read_excel(filename, header=None)
読み込んだデータを表示してみます。
display(df)
エクセル上で空欄だったセルはNaNという欠損値で埋められています。
データの抽出
display()で表示した表から温度の値を取得してみます。
温度の値`25`はindex表記で2行目の5列目に存在します。
このように行と列の位置を整数で指定してデータを抽出するために`iloc`を用いることができます。
iloc[行, 列]と指定します。
# 温度の値を取得
temp = df.iloc[2, 5]
print(f"温度:{temp}℃\n")
また、表形式のデータとして必要な部分は時間、距離であり、indexが2,3のカラムであることがわかります。
さらに、時間、距離は4行目以降(indexは3以降)に記録されており、3行目までの値は不要です。
つまり、index表記の3行目以降でかつ、2、3列目のデータが必要なデータとなります。
先ほど用いた`iloc`で以下のように記述することで範囲指定することができます。
抽出したdfは新しい変数df_subに格納します。
df_sub = df.iloc[3:,[2,3]]
display(df_sub)
必要な表のみ抽出することはできましたが、indexやカラムが途中から始まっていて分かりづらいです。
そこでindexはリセットし、カラム名は新しく作成したdf_subの1行目である`時間`と`距離`にしてみます。
df_sub.columns = df_sub.iloc[0].tolist()
df_sub = df_sub.iloc[1:]
df_sub = df_sub.reset_index(drop=True)
display(df_sub)
表形式のデータをグラフ表示したり、計算処理を行う場合はdfの型が数値型である必要があります。
df_sub = df_sub.astype(float)
print(df_sub.dtypes)
データの可視化
最後に、時間をx軸、距離をy軸にプロットしてみます。
# 線形近似
a,b=np.polyfit(df_sub["時間"],df_sub["距離"],1)
# データをプロット
plt.figure(figsize=(8, 6))
plt.scatter(df_sub["時間"], df_sub["距離"], color='k', label="Data")
plt.plot(df_sub["時間"], a*df_sub["時間"]+b, color='r', label="Linear Fit")
plt.legend()
plt.xlabel("time")
plt.ylabel("distance")
plt.grid(True)
figname = f"{DIR}/plot_test2.png"
plt.savefig(figname)
plt.show()
複雑なエクセルファイルをpythonで読み込み、必要な部分を抽出して可視化することができました。
まとめ
最後に当記事で解説したコードをまとめて表示します。
見やすさのために1つのセルに全てのコードをまとめていますが、コードセルは適宜分けてください。(もちろん1つのセルにまとめてコピペしても動きます。)
解説を読み飛ばしてまとめにたどり着いた方は、Google Colaboratoryで以下のコードを動かしてみてください。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Google Driveをマウント
drive.mount('/content/drive')
# パス定義
DIR = "drive/My Drive/python/"
filename = DIR + "complex_data.xlsx"
# エクセルファイルからデータを読み込む
df = pd.read_excel(filename, header=None)
print("エクセルファイル全体")
display(df)
print()
# 温度の値を取得
temp = df.iloc[2, 5]
print(f"温度:{temp}℃\n")
# 必要な部分を抽出
df_sub = df.iloc[3:,[2,3]]
df_sub.columns = df_sub.iloc[0].tolist()
df_sub = df_sub.iloc[1:]
df_sub = df_sub.reset_index(drop=True)
print("抽出したdf")
display(df_sub)
print()
# float型に変換
df_sub = df_sub.astype(float)
print("型確認")
print(df_sub.dtypes)
print()
# 線形近似
a,b=np.polyfit(df_sub["時間"],df_sub["距離"],1)
# データをプロット
plt.figure(figsize=(8, 6))
plt.scatter(df_sub["時間"], df_sub["距離"], color='k', label="Data")
plt.plot(df_sub["時間"], a*df_sub["時間"]+b, color='r', label="Linear Fit")
plt.legend()
plt.xlabel("time")
plt.ylabel("distance")
plt.grid(True)
figname = f"{DIR}/plot_test2.png"
plt.savefig(figname)
plt.show()