同じワークブックの複数のワークシートでPandasを使用してpd.read_excel()を実行する


168

python pandasを使用して処理している大きなスプレッドシートファイル(.xlsx)があります。その大きなファイルの2つのタブのデータが必要になることがあります。タブの1つには大量のデータがあり、もう1つは数個の正方形のセルです。

私が使用している場合pd.read_excelを()の任意のワークシートファイル全体がロードされるように、それは(私が興味のワークシートだけではなく)私には見えます。したがって、メソッドを2回(シートごとに1回)使用すると、ワークブック全体が2回読み込まれることになります(指定したシートのみを使用している場合でも)。

私はそれを間違って使用していますか、それともこのように制限されていますか?

ありがとうございました!


回答:


247

試してくださいpd.ExcelFile

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')

@HaPsantranで述べたように、ExcelFile()呼び出し中にExcelファイル全体が読み込まれます(これを回避する方法はないようです)。これにより、新しいシートにアクセスするたびに同じファイルを読み取る必要がなくなります。

sheet_nameへの引数pd.read_excel()は、シートの名前(上記のとおり)、シート番号を指定する整数(0、1など)、シート名またはインデックスのリスト、またはである可能性があることに注意してくださいNone。リストが提供されている場合は、キーがシート名/インデックスであり、値がデータフレームであるディクショナリを返します。デフォルトでは、最初のシート(つまりsheet_name=0)を返すだけです。

場合はNone指定されている、すべてのシートが通り、返され{sheet_name:dataframe}た辞書。


4
FWIW、それは(前回テストしたとき)最初の行がすべてで読み込まれるように見えるため、単一のシートだけを効率的に取り込む方法はありませんが、少なくとも複数のシートを取得する場合は、シート全体を複数回読み込む必要はありません。
HaPsantran 2016年

1
この回答はパンダによって廃止され、v0.21.0でクラッシュします。@ Mat0kanで指定されたものに置き換える必要があります。
DStauffman

1
@DStauffmanこれはまだ私にとってはうまく機能し、コードやドキュメントからこれが廃止されているという兆候は見られません。問題が発生した場合は、パンダまたはxlrd(パンダが使用するpython excel解析ライブラリ)の問題をgithubに送信します
Noah

@Noah、これをもう少し詳しく調べてくれてありがとう。sheet_nameそうsheetnameです。私が使用している限り、機能します。それがまだread_excelメソッドで機能していたが、解析メソッドでは機能していなかったため、それが非推奨の部分であることに気付きませんでした。
DStauffman 2017

@ノア確かにいい答えです。あなたが読んだExcelシートでアクティブセルを見つける方法はありますか?
Eswar

97

3つのオプションがあります。

すべてのシートを順序付けされた辞書に直接読み込みます。

import pandas as pd

# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)

# for pandas version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)

それを指摘してくれた@ihightower、バージョンの問題を指摘してくれた@toto_ticoに感謝します。

最初のシートを直接データフレームに読み込みます

df = pd.read_excel('excel_file_path.xls')
# this will read the first sheet into df

Excelファイルを読み取り、シートのリストを取得します。次に、シートを選択してロードします。

xls = pd.ExcelFile('excel_file_path.xls')

# Now you can list all sheets in the file
xls.sheet_names
# ['house', 'house_extra', ...]

# to read just one sheet to dataframe:
df = pd.read_excel(file_name, sheetname="house")

すべてのシートを読み、辞書に保存します。最初と同じですが、より明示的です。

# to read all sheets to a map
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name)

更新:バージョンの問題を指摘してくれて、@ toto_ticoに感謝します。

sheetname:string、int、strings / intの混合リスト、またはNone、デフォルト0バージョン0.21.0以降非推奨:代わりにsheet_nameを使用してくださいソースリンク


12
私はマップにすべてのシートを読み取るために、(0.20.3)があること、最新のパンダに...必要とされるすべてがあるdf_sheet_map = pd.read_excel(file_fullpath, sheetname=None)、これは、このようなデータフレームとして自動的に辞書内のシート...とアクセスシートを持っています、:df_sheet_map['house']
ihightower

32

シートのインデックスを使用することもできます。

xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)

最初のワークシートを提供します。2番目のワークシートの場合:

sheet2 = xls.parse(1)

7
xls.sheet_namesと入力するだけでなく、シート名のリストが必要な場合
Stefano Fedele

28

シート名をパラメーターとして指定することもできます。

data_file = pd.read_excel('path_to_file.xls', sheet_name="sheet_name")

シートのみをアップロードします"sheet_name"


9
pd.read_excel('filename.xlsx') 

デフォルトでは、ワークブックの最初のシートを読みます。

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 

ブックの特定のシートを読み、

pd.read_excel('filename.xlsx', sheet_name = None) 

すべてのワークシートをExcelからpandasデータフレームに読み取ります。OrderedDictのタイプはネストされたデータフレームを意味し、すべてのワークシートはデータフレーム内に収集されたデータフレームとして、そのタイプはOrderedDictです。


1

はい、残念ながらそれは常に完全なファイルをロードします。これを繰り返し行う場合は、シートを抽出してCSVを分けてから個別にロードするのがおそらく最善です。d6tstackでそのプロセスを自動化できます。これにより、すべてのシートまたは複数のExcelファイルですべての列が等しいかどうかをチェックするなどの追加機能も追加されます。

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

d6tstack Excelの例を参照してください


0

あなたがあなたのPythonプログラム(相対アドレス指定)と同じフォルダにExcelファイルを保存したならば、あなたはファイル名と共にシート番号を言及する必要があるだけです。Syntax = pd.read_excel(Filename、SheetNo)例:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.