
【pandas入門】Google Colab でExcelを読み込み、to_dict(orient='records')で1行ずつ取り出す
Python の pandas を練習しています。今回は Google Colab に Excel ファイルをアップロードして読み込み、1行ずつ辞書として取り出すところまでをやってみました。手元の Colab ノートブックで実際に動かしたコードと出力をそのまま載せます。
1. 使ったデータ
練習用に作ったダミーの社員データ(pandas_practice_dummy_data.xlsx)です。10人分で、列は次の6つです。
社員ID(E0001〜E0010)
氏名
部署(営業部・開発部・総務部・人事部)
売上金額
評価(A / B / C)
入社年度
2. Colab に Excel ファイルをアップロードする
Colab の実行環境はクラウド上にあるので、手元のファイルはそのままでは読めません。google.colab の files モジュールを使うと、セルの下にファイル選択ボタンが出てアップロードできます。
from google.colab import files
uploaded = files.upload()ファイルを選ぶと、次のように表示されて Colab の作業フォルダに保存されます。
Saving pandas_practice_dummy_data.xlsx to pandas_practice_dummy_data.xlsx3. read_excel で読み込み、to_dict で辞書に変換する
pd.read_excel() で Excel を DataFrame として読み込みます。DataFrame はそのまま print すると表の形で出ますが、今回は to_dict(orient='records') で「1行=1つの辞書」のリストに変換してみました。
import pandas as pd
df = pd.read_excel('pandas_practice_dummy_data.xlsx')
print(df.to_dict(orient='records'))出力(先頭3件のみ抜粋):
[{'社員ID': 'E0001', '氏名': '佐藤 健', '部署': '営業部', '売上金額': 271958, '評価': 'C', '入社年度': 2020},
{'社員ID': 'E0002', '氏名': '鈴木 一郎', '部署': '開発部', '売上金額': 296867, '評価': 'B', '入社年度': 2023},
{'社員ID': 'E0003', '氏名': '高橋 優', '部署': '営業部', '売上金額': 281932, '評価': 'B', '入社年度': 2015},
...]列名がキー、セルの値が値になった辞書が、行の数だけリストに並びます。
orient の指定に注意
最初、orient=record と引用符なしで書いていました。すると Colab の補完機能が from numpy._core.records import record という import 文を勝手に足していて、文字列ではなく numpy のオブジェクトを渡す形になっていました。
orient に渡すのは文字列の 'records'(末尾に s)です。補完で入った不要な import は消しておきます。
4. for 文で1行ずつ取り出す
リストになっているので、あとは普通の for 文で回せます。enumerate() を使うと、行番号 i と行の中身 d を同時に受け取れます。辞書なので d['氏名'] のように列名で値を取り出せるのが便利です。
import pandas as pd
df = pd.read_excel('pandas_practice_dummy_data.xlsx')
data = df.to_dict(orient='records')
for i, d in enumerate(data):
print('社員ID', d['社員ID'])
print('氏名', d['氏名'])
print('部署', d['部署'])出力(先頭2人分を抜粋):
社員ID E0001
氏名 佐藤 健
部署 営業部
社員ID E0002
氏名 鈴木 一郎
部署 開発部
...このコードでは i を使っていないので、for d in data: でも同じ結果になります。何行目かを表示したいときは print(i, d['氏名']) のように使えます。
まとめ
Colab では files.upload() で手元のファイルをアップロードできる
pd.read_excel() で Excel を DataFrame として読める
to_dict(orient='records') で「1行=1辞書」のリストになる
orient には文字列 'records' を渡す(補完で入る import に注意)
enumerate() と組み合わせると、行番号付きで1行ずつ処理できる