ヘタレシステム管理者の管理人です。
pythonの勉強は7日目になります。
なかなか先が見えません。
かなり疲れました。
さて本日は一端、エクセル操作に戻ります。
エクセルから表のデータを抽出する
さて、本日のお勉強は・・・
エクセルの表をそのままデータフレームとしてpythonで抽出します。
エクセルからデータフレームを抽出するライブラリは・・・
【pandas】というらしいのでとりあえず、コマンドプロンプトでインストールします。
pip install pandas
次に、エクセルで架空のデータを作成します。
前回の線形計画で利用した・・・
各工場から各店舗に商品(必要数)を配送した場合の最低コストを求める為の表です。
コードは?
コードは次のとおりです。
#ライブラリをインポート
import pandas
import openpyxl
#ファイルを指定
#df = pandas.read_excel('E:\\python_work\\pandas_test.xlsx', sheet_name=0,index_col=0)
#df = pandas.read_excel('pandas_test.xlsx', sheet_name=[0,1],index_col=0)
df = pandas.read_excel('pandas_test.xlsx', sheet_name=0,index_col=0)
#データフレームとして表示
print(df) #データフレーム
print(type(df)) #タイプを表示 dataframe or dict
print(len(df)) #データフレームの長さ
print(df.keys()) #シート番号又は名前
実行すると次のとおりEXCELの表が抽出できます。
店 a 店 b 店 c 供給量
工場 x 10 6 16 8.0
工場 y 8 8 4 16.0
需要量 12 4 8 NaN
<class 'pandas.core.frame.DataFrame'>
3
Index(['店 a', '店 b', '店 c', '供給量'], dtype='object')
全てのシートを一気に抽出することもできる
ファイルを指定する行で・・・
sheet_name=None
と指定すると全てのシートのデータを抽出できます。
df = pandas.read_excel('pandas_test.xlsx', sheet_name=None,index_col=0)
試しに次のコードを実行してみます。(適当にsheet2を作成しています)
#ライブラリをインポート
import pandas
import openpyxl
#ファイルを指定
#df = pandas.read_excel('E:\\python_work\\pandas_test.xlsx', sheet_name=0,index_col=0)
#df = pandas.read_excel('pandas_test.xlsx', sheet_name=[0,1],index_col=0)
df = pandas.read_excel('pandas_test.xlsx', sheet_name=None,index_col=0)
#データフレームとして表示
print(df) #データフレーム
print(type(df)) #タイプを表示 dataframe or dict
print(len(df)) #データフレームの長さ
print(df.keys()) #シート番号又は名前
実行結果
{'Sheet1': 店 a 店 b 店 c 供給量
工場 x 10 6 16 8.0
工場 y 8 8 4 16.0
需要量 12 4 8 NaN, 'Sheet2': 店 H 店 I 店 J 供給量
工場 O 10 6 16 8.0
工場 P 8 8 4 16.0
需要量 12 4 8 NaN}
<class 'dict'>
2
dict_keys(['Sheet1', 'Sheet2'])
sheet1とsheet2に改行が入っていませんので、やや見にくい結果となりまいた。
行と列を指定して抽出する
【iloc】を使うと・・・
データの範囲を選択して抽出できます。
今回抽出したい範囲は・・・
下図の赤枠の範囲です。
コードは次のとおりとなります。
#ライブラリをインポート
import pandas
import openpyxl
#ファイルを指定 1行目と1列目を【0】指定
df = pandas.read_excel('pandas_test.xlsx', sheet_name=0,header=None,index_col=None)
df2 = df.iloc[1:3,1:4]
#表示
print(df2.to_string(header=False, index=False))
基本的なことですが【pandas】では【header:列】・【index:行】となります。
header=None,index_col=None
を指定することで・・・・
1行目と1列目が【0】指定となり選択し易くなります。
【iloc】では・・・
iloc:[行範囲始め:終わり,列範囲始め:終わり]
となります。
iloc:[:,:]
とすると全行列指定となります。
上ののコードの例では・・・
1行目と1列目が【0】指定なので・・・
iloc[1:3,1:4] は(表の2行目から3行目・2列目から4行目までの選択となります。)
※指定範囲の最後の行列は含まれないので要注意です。
コードを実行すると
次の結果が得られます。
10 6 16
8 8 4
普通に実行すると・・・
1 2 3
1 10 6 16
2 8 8 4
が返ります・・・
print(df2.to_string(header=False, index=False))
を指定することで・・・行番号と列番号を非表示にできます。
結果をエクセルに書き込む
次に結果をエクセルに書き込みます。
コードは次のとおりです。(既存のファイルにシートを追加する)
#ライブラリをインポート
import pandas
import openpyxl
#ファイルを指定
df = pandas.read_excel('pandas_test.xlsx', sheet_name=0,header=None,index_col=None)
df2 = df.iloc[1:3,1:4]
#表示
print(df2.to_string(header=False, index=False))
#エクセルに書き込み
#df2.to_excel('pandas_test2.xlsx', sheet_name='new_sheet',header=False, index=False)
with pandas.ExcelWriter('pandas_test2.xlsx',engine='openpyxl',mode='a',if_sheet_exists='new') as xlswriter:
df2.to_excel(xlswriter, sheet_name='new_sheet',header=False, index=False)
新規ファイルを作成する場合は・・・
df2.to_excel('新規ファイル名.xlsx', sheet_name='new_sheet',header=False, index=False)
とします。
,header=False, index=False
を指定しないと番号の行列名が勝手に入ります。
既存のファイルにシートを追加する場合は・・・
with pandas.ExcelWriter('既存のファイル名.xlsx',engine='openpyxl',mode='a',if_sheet_exists='new') as xlswriter:
を指定してからファイルを書き込みます。
シート名が存在するときは・・・
次のコートを指定することで新規シートを作成してくれます。
,if_sheet_exists='new')
上図の様に指定した範囲のデータを抽出し・・・
別ファイルに書き込みできました。
本日はここまです。
コメント