Pandasを使って複雑なエクセルやCSVファイルの表を効率的に整理する方法

エクセルや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()

タイトルとURLをコピーしました