Menggunakan Pandas untuk pd.read_excel () untuk beberapa lembar kerja dari buku kerja yang sama


168

Saya memiliki file spreadsheet besar (.xlsx) yang saya proses menggunakan python panda. Kebetulan saya butuh data dari dua tab di file besar itu. Salah satu tab memiliki satu ton data dan yang lainnya hanya beberapa sel persegi.

Ketika saya menggunakan pd.read_excel () pada lembar kerja apa pun , menurut saya seluruh file dimuat (bukan hanya lembar kerja yang saya minati). Jadi ketika saya menggunakan metode ini dua kali (satu kali untuk setiap lembar), saya secara efektif harus membiarkan seluruh buku kerja dibaca dua kali (meskipun kami hanya menggunakan lembar yang ditentukan).

Apakah saya salah menggunakannya atau hanya terbatas dengan cara ini?

Terima kasih!


Jawaban:


247

Coba pd.ExcelFile:

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

Seperti dicatat oleh @HaPsantran, seluruh file Excel dibaca selama ExcelFile()panggilan (tampaknya tidak ada cara untuk mengatasi ini). Ini hanya menyelamatkan Anda dari keharusan membaca file yang sama di setiap kali Anda ingin mengakses lembar baru.

Perhatikan bahwa sheet_nameargumen untuk pd.read_excel()dapat berupa nama lembar (seperti di atas), bilangan bulat yang menentukan nomor lembar (misalnya 0, 1, dll), daftar nama lembar atau indeks, atau None. Jika daftar disediakan, itu mengembalikan kamus di mana kunci adalah nama lembar / indeks dan nilainya adalah bingkai data. Standarnya adalah hanya mengembalikan lembar pertama (yaitu, sheet_name=0).

Jika Noneditentukan, semua lembar dikembalikan, sebagai {sheet_name:dataframe}kamus.


4
FWIW, sepertinya (terakhir kali saya mengujinya) baris pertama memuat semuanya , jadi tidak ada cara untuk secara efisien menarik hanya satu lembar, tetapi setidaknya mendapatkan beberapa lembar tidak memerlukan banyak beban dari seluruh lembar.
HaPsantran

1
Jawaban ini telah ditinggalkan oleh panda dan sekarang macet untuk saya di v0.21.0. Itu harus diganti dengan yang diberikan oleh @ Mat0kan.
DStauffman

1
@Dstauffman Ini masih berfungsi dengan baik untuk saya dan saya tidak melihat indikasi dari kode atau dokumen bahwa ini sudah usang. Jika Anda mengalami masalah dengan itu, saya akan mengirimkan masalah pada github untuk panda atau xlrd (perpustakaan python excel parsing yang digunakan oleh panda)
Noah

@Noah, terima kasih saya melihat ini lagi dan Anda benar, itu masih berfungsi selama saya gunakan sheet_namedan tidak sheetname. Saya tidak menyadari bahwa itu adalah bagian yang sudah usang, karena masih bekerja pada metode read_excel, tetapi tidak pada metode parse.
DStauffman

@Noah Memang jawaban yang bagus. Apakah ada cara untuk menemukan sel aktif di lembar excel yang Anda baca?
Eswar

97

Ada 3 opsi:

Baca semua lembar langsung ke kamus yang dipesan.

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)

Terima kasih @ihightower untuk menunjukkannya dan @toto_tico karena menunjukkan masalah versi.

Baca lembar pertama langsung ke dalam bingkai data

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

Baca file excel dan dapatkan daftar sheet. Kemudian pilih dan muatkan lembaran.

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

Baca semua lembar dan simpan dalam kamus. Sama seperti yang pertama tetapi lebih eksplisit.

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

Pembaruan: Terima kasih @toto_tico karena menunjukkan masalah versi.

sheetname: string, int, daftar campuran string / int, atau Tidak ada, default 0 Tidak digunakan sejak versi 0.21.0: Gunakan sheet_name sebagai gantinya Sumber Tautan


12
dalam panda terbaru yang saya miliki (0.20.3), untuk membaca semua lembar ke peta .. semua yang diperlukan adalah df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), ini akan memiliki lembaran dalam kamus secara otomatis .. dan mengakses lembar sebagai kerangka data seperti ini:df_sheet_map['house']
ihightower

32

Anda juga dapat menggunakan indeks untuk sheet:

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

akan memberikan lembar kerja pertama. untuk lembar kerja kedua:

sheet2 = xls.parse(1)

7
Jika Anda menginginkan daftar nama sheet, daripada hanya mengetik xls.sheet_names
Stefano Fedele

28

Anda juga bisa menentukan nama sheet sebagai parameter:

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

hanya akan mengunggah sheet "sheet_name".


9
pd.read_excel('filename.xlsx') 

secara default baca lembar pertama buku kerja.

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

baca lembar kerja tertentu dan

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

membaca semua lembar kerja dari excel ke panda dataframe sebagai tipe dari OrderedDict berarti kumpulan data bersarang, semua lembar kerja sebagai dataframe yang dikumpulkan di dalam dataframe dan tipenya adalah OrderedDict.


1

Ya sayangnya itu akan selalu memuat file lengkap. Jika Anda melakukan ini berulang kali, mungkin yang terbaik untuk mengekstrak lembar untuk memisahkan CSV dan kemudian memuat secara terpisah. Anda dapat mengotomatiskan proses itu dengan d6tstack yang juga menambahkan fitur tambahan seperti memeriksa apakah semua kolom sama di semua lembar atau beberapa file Excel.

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

Lihat contoh d6tstack Excel


0

Jika Anda telah menyimpan file excel di folder yang sama dengan program python Anda (Pengalamatan Relatif) maka Anda hanya perlu menyebutkan nomor sheet bersama dengan nama file. Sintaks = pd.read_excel (Nama file, SheetNo) Contoh:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.