プログラム初心者がpythonを勉強する方法!その7・pandasでもエクセルからデータフレームを抽出してみる!

スポンサーリンク
050-VBA

ヘタレシステム管理者の管理人です。

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') 

上図の様に指定した範囲のデータを抽出し・・・

別ファイルに書き込みできました。

本日はここまです。

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

コメント

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