TechNote

事務屋のおぼえがき

【Python】業務でよく使いそうなPandasとopenpyxlサンプル(にわかのメモ)

にわかのメモ。

1.Pandasとは

Pythonは学習コストが低いわりにいろんなことができてとても使いやすい言語。
そのPythonを触る中でも、とにかく便利でユニークな存在なのがPythonのライブラリである「Pandas」。

Pandasを使うと、「DataFrame」(という独自のデータ構造)上で手軽にごにょごにょデータをいじくり回せて便利。Pythonの高速な多次元配列計算ライブラリであるNumPyを使って実装されてて、複雑な演算も高速に処理できる。

実際は欠損値(NaN値)の部分をどう扱うか(平均値や最大値・最小値で値を埋めるとか)など細かい指定ができたり、とにかくなんでもかんでも揃っているのがPandasの本当にすごいところ。でも今のところそこまで使う機会はなさそう。

とりあえず少しだけ触ってみて、自分がよく使いそうなパターンを最低限メモしておく。(※事務屋がやりたそうなことはWinPython+この辺の知識だけで、情シスに何かのインストール依頼とかすることなく大概できそう。)



2.業務でよく使いそうなPandasとopenpyxlサンプル

まずはcsvファイルを読み込んで、sqlライクな操作で目的の値を抽出したり合計をとったりした後、Excelファイルに書き込む例。

import pandas as pd
import openpyxl

#csvファイル読み込み
df = pd.read_csv('d:\sample.csv', encoding = 'utf-8')

# DataFrame側で抽出操作
df2 = df.query('subject=="Science" and sex=="male"')

# df_db2.sum(axis=0) で全カラムも可
sum_score = df2['score'].sum(axis=0)


# 既存のExcelへ書き出し
wb = openpyxl.load_workbook('d:\output.xlsx')
sheet = wb['Sheet1']
sheet['A1'] = sum_score
wb.save('d:\output.xlsx')

以下はdb操作(ここではsqlite)も含んだ例。ここでは入れたり出したり意味のないことをしているが、dbとのやりとりも簡単に可能ということをメモしておきたいだけ。
DataFrameが超強力なので、データ操作をごにょごにょしていく際にわざわざにsqlを使う必要はないが、最初の読み込みや、最後の書き込みをdbに対して行う機会はよくあるはず。

import pandas as pd
import sqlite3
import openpyxl

#csvをDataFrameに読み込む
df = pd.read_csv('d:\sample.csv', encoding = 'utf-8')

# db接続してtableにDataFrameの内容を突っ込む
dbname = 'sample.db'
conn = sqlite3.connect(dbname)
df.to_sql('sample_table',conn,if_exists='replace')

#tableよりある条件のものだけDataFrameへ読み込む
#DataFrameの名前の付け方のセオリーは今のところよく知らない
df_db = pd.read_sql('select * from sample_table where flg=1', conn)
conn.close()

# DataFrame側でごにょごにょ
df_db2 = df_db.query('subject=="Science" and sex=="male"')
sum_score = df_db2['score'].sum(axis=0)

# 既存のExcelへ書き出し
wb = openpyxl.load_workbook('d:\output.xlsx')
sheet = wb['Sheet1']
sheet['E1'] = sum_score
wb.save('d:\output.xlsx')