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!

HaPsantran
sumber

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.

Nuh
sumber
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

Vikash Singh
sumber
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)
Elliott
sumber
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".

Mat0kan
sumber
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.

Ashu007
sumber
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

citynorman
sumber
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()
Nikita Agarwala
sumber