なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

【Python】Pandasでエクセルファイル(.xlsx)をDBの様に使うサンプルコード

Pythonで表データの読み出し書き出し

PythonではPandasを使うことで簡単に表計算を行うことができますが、データをファイルとして保存する場合には一工夫が必要です。

そこで今回はPandasの表データをエクセルファイル(.xlsx)に保存/読み込みするサンプルコードをご紹介したいと思います。

f:id:karupoimou:20191220020059p:plain:w400
サンプルコード

エクセルファイル(.xlsx)に表データを入れるメリット・デメリット

メリット

メリットはデータを簡単に見れることです。複製や編集などの扱いも簡単です。

デメリット

デメリットとしてはファイルの容量が大きくなると読み出しに時間が掛かる様になることです。
このエクセルファイルを一時データの保存先に使う方法は大きなデータには向きません。

準備

pip

pip install pandas
pip install xlsxwriter

基本

import pandas as pd
import xlsxwriter

# 表に入れる内容
item=[["apple","100"],["orange","150"],["banana","50"],["apple","200"]]

# データフレームの作成
df = pd.DataFrame(item, columns=["item","price"])
display(df)

f:id:karupoimou:20191220010229p:plain

書き出し/読み込み

import pandas as pd
import xlsxwriter

# 表に入れる内容
item=[["apple","100"],["orange","150"],["banana","50"],["apple","200"]]

# データフレームの作成
df = pd.DataFrame(item, columns=["item","price"])

# データフレームの表示
display(df)

# ファイルへ書き出し
df.to_excel('item.xlsx')

# ファイルから読み込み
df = pd.read_excel("item.xlsx", index_col=0)
説明

df.to_excel('item.xlsx')
エクセルファイルに書き出しが出来る。書き出し先に同名ファイルが存在しない場合は新規作成され、既に存在する場合は上書き更新されます。

df = pd.read_excel("item.xlsx", index_col=0)
上記のコードで一シート目の表をデータフレームとして読み込む事ができる。

なお文字のエンコーディング関係でエラーが出る場合や複数シートを利用したい場合などはxlsxwriterを通して保存すると良いです。

xlsxwriterを使う場合の例
# xlsxwriterを通して書き込み
writer = pd.ExcelWriter("item.xlsx",options={"strings_to_urls": False}, engine="xlsxwriter")
df.to_excel(writer, sheet_name="Sheet1")
writer.close() 

DBっぽく使う方法

データフレームをリストに変換する

import pandas as pd
import xlsxwriter

# ファイルから読み込み
df = pd.read_excel("item.xlsx", index_col=0)

# データフレームをリストに変換する
item_list=df.values.tolist()

display(item_list)

[['apple', 100], ['orange', 150], ['banana', 50], ['apple', 200]]

指定列をリストとして取得する

import pandas as pd
import xlsxwriter

# ファイルから読み込み
df = pd.read_excel("item.xlsx", index_col=0)

# 指定列をリストとして取得する
item_name = df["item"].values.tolist()
display(item_name)

item_price = df["price"].values.tolist()
display(item_price)

['apple', 'orange', 'banana', 'apple']
[100, 150, 50, 200]

指定行を行番号指定でリストとして取得する

item_list = df[0:3].values.tolist()
display(item_list)

[['apple', 100], ['orange', 150], ['banana', 50]]

df[0:3]の部分で0~3行目までを範囲指定しています。

指定行を条件指定でリストとして取得する

item_list = df[df["item"]=="apple"].values.tolist()
display(item_list)

[['apple', 100], ['apple', 200]]

df[df["item"]=="apple"]の部分でitme列がappleの行のみを抽出指定しています。

条件指定には==の他に、>や<などを使用することも可能

price_list = df[df["price"]<=100].values.tolist()
display(price_list )

[['apple', 100], ['banana', 50]]

データフレームの集計

# appleを抽出したデータフレームを作成
df2 = df[df["item"]=="apple"]

# データ数
price_cnt = df2["price"].count()
display(price_cnt)

# 合計
price_sum = df2["price"].sum()
display(price_sum)

# 平均
price_mean = df2["price"].mean()
display(price_mean)

なお単純に統計量を知りたい場合はdescribe()を使うと簡単です。

df2 = df[df["item"]=="apple"]
df2.describe()

f:id:karupoimou:20191220015207p:plain