私はpandasに飛び込み、実験します。Excelファイルからデータを読み取ることに関しては、ExcelFileをread_Excelに使用することの違いは何でしょうか。両方のケースで、ドキュメントは同じ方法について説明しています:「ExcelテーブルをDataFrameに読み込む」および「Excelテーブルをpandas DataFrameに読み込む"。( read_Excelのドキュメント 、および Excel_fileの場合 )
ここでSOを使用し、違いに対処せずに使用します。また、Google検索では、この問題を説明する結果が得られませんでした。
私のテストでWRT、これらは同等のようです:
path = "test/dummydata.xlsx"
xl = pd.ExcelFile(path)
df = xl.parse("dummydata") # sheet name
そして
path = "test/dummydata.xlsx"
df = pd.io.Excel.read_Excel(path, sheetname=0)
後者は私に行を節約するという事実以外に、2つの間に違いはありますか、どちらかを使用する理由はありますか?
ありがとう!
構文以外に特に違いはありません。技術的には、ExcelFile
はクラスであり、read_Excel
は関数です。どちらの場合でも、実際の解析はExcelFile
内で定義された_parse_Excel
メソッドによって処理されます。
パンダの以前のバージョンでは、 read_Excel
は完全に単一のステートメント(コメントを除く)で構成されていました。
return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname,
kind=kind, **kwds)
そして、 ExcelFile.parse
はExcelFile._parse_Excel
を呼び出す以上のことはしませんでした。
パンダの最近のバージョンでは、 read_Excel
がExcelFile
オブジェクトを持っていることを確認し(そうでない場合は作成します)、_parse_Excel
を呼び出します直接メソッド:
if not isinstance(io, ExcelFile):
io = ExcelFile(io, engine=engine)
return io._parse_Excel(...)
そして、更新された(統一された)パラメータ処理により、 ExcelFile.parse
は実際にはただ1つのステートメントです。
return self._parse_Excel(...)
それがExcelFile.parse
のドキュメントが今言う理由です
Read_Excel(ExcelFile、...)と同等受け入れられたパラメーターの詳細については、read_Excel docstringを参照してください
ループ内でExcelFile.parse
が高速であると主張する 別の答え については、それは本当にExcelFile
オブジェクトを毎回ゼロから作成しているかどうかにかかっています。ループ外でExcelFile
を一度作成し、ループ内でread_Excel
にthatを渡すことは確かです。
xl = pd.ExcelFile(path)
for name in xl.sheet_names:
df = pd.read_Excel(xl, name)
これは次と同等です
xl = pd.ExcelFile(path)
for name in xl.sheet_names:
df = xl.parse(name)
ループに異なるパスが含まれる場合(つまり、1つのワークブック内の複数のシートだけでなく、多くの異なるワークブックを読んでいる場合)、とにかく各パスに新しいExcelFile
インスタンスを作成する必要はありません。もう一度、ExcelFile.parse
とread_Excel
の両方が同等になります(同様に低速になります)。
ExcelFile.parse
は高速です。
ループでデータフレームを読み込んでいるとします。 ExcelFile.parse
Excelfile
オブジェクト(あなたの場合はxl
)を渡すだけです。したがって、Excelシートは一度ロードされるだけで、これを使用してデータフレームを取得します。 Read_Excelの場合、Excelfile
オブジェクトの代わりにパスを渡します。したがって、基本的にはワークブックが再度ロードされるたびに。ブックに大量のシートと数万行がある場合、混乱を招きます。
Pandas Excelの最初の実装では2ステップのプロセスを使用しましたが、read_Excelという1ステップのプロセスを追加しました。