Aynı çalışma kitabının birden çok çalışma sayfası için pd.read_excel () işlevine pandalar kullanma


168

Python pandalar kullanarak işlediğim büyük bir elektronik tablo dosyası (.xlsx) var. Bu büyük dosyadaki iki sekmeden veriye ihtiyacım var. Sekmelerden birinde bir ton veri ve diğeri sadece birkaç kare hücredir.

Ben kullandığınızda () pd.read_excel üzerinde herhangi çalışma tüm dosya (ilgilendiğim sadece çalışma sayfası) yüklenir gibi, bana bakıyor. Bu yüzden yöntemi iki kez kullandığımda (her sayfa için bir kez), tüm çalışma kitabının iki kez okunduğunu (sadece belirtilen sayfayı kullanmamıza rağmen) etkili bir şekilde acı çekmem gerekiyor.

Yanlış mı kullanıyorum yoksa sadece bu şekilde mi sınırlı?

Teşekkür ederim!


Yanıtlar:


247

Deneyin pd.ExcelFile:

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

@HaPsantran tarafından belirtildiği gibi, tüm Excel dosyası ExcelFile()çağrı sırasında okunur (bunun bir yolu yoktur). Bu, yeni bir sayfaya her erişmek istediğinizde aynı dosyayı okumak zorunda kalmanızı önler.

Not, sheet_namebağımsız değişkeni pd.read_excel()(yukarıdaki gibi) tabakanın adı olabilir, tabaka sayısını belirten bir tamsayıdır (örneğin, 0, 1, vs.), tabaka isimleri ya da indisleri, veya bir listesini None. Bir liste sağlanırsa, anahtarların sayfa adları / dizinleri ve değerlerin veri çerçeveleri olduğu bir sözlük döndürür. Varsayılan, yalnızca ilk sayfayı (yani sheet_name=0) döndürmektir .

Eğer Nonebelirtilirse, tüm sayfaları bir şekilde, döndürülür {sheet_name:dataframe}sözlüğe.


4
FWIW, her şeyde ilk satır yüklendiğine (son test ettiğimde) benziyor , bu yüzden sadece tek bir sayfayı verimli bir şekilde çekmenin bir yolu yok, ancak en azından birden fazla sayfa almak tüm sayfanın birden fazla yükünü gerektirmiyor.
HaPsantran

1
Bu cevap pandalar tarafından reddedildi ve şimdi v0.21.0'da çöküyor. @ Mat0kan tarafından verilen ile değiştirilmelidir.
DStauffman

1
@DStauffman Bu benim için hala iyi çalışıyor ve koddan veya belgelerin kullanımdan kaldırıldığına dair hiçbir belirti görmüyorum. Sorun yaşıyorsanız, pandalar veya xlrd (pandalar tarafından kullanılan python excel ayrıştırma kütüphanesi) için github ile ilgili bir sorun gönderirim
Noah

@Noah teşekkürler biraz daha bu içine baktı ve sağa, uzun kullandığım gibi hala çalışır konum sheet_namedeğil sheetname. Hala read_excel yöntemi üzerinde çalışıyordu, ancak ayrıştırma yöntemi üzerinde değil, çünkü kullanımdan kaldırılmış kısmı olduğunu fark etmedi.
DStauffman

@Noah Gerçekten güzel bir cevap. Okuduğunuz Excel sayfasındaki aktif hücreyi bulmanın bir yolu var mı?
Eswar

97

3 seçenek vardır:

Tüm sayfaları doğrudan sıralı bir sözlüğe okuyun.

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)

@İhightower'ı işaret ettiğiniz için ve @toto_tico sürüm sorununu işaret ettiğiniz için teşekkürler

İlk sayfayı doğrudan veri çerçevesine okuyun

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

Excel dosyasını okuyun ve sayfaların bir listesini alın. Sonra sayfaları seçip yükleyin.

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

Tüm sayfaları okuyun ve bir sözlükte saklayın. İlk ile aynı ama daha açık.

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

Güncelleme: Sürüm sorununa işaret ettiğiniz için @toto_tico'ya teşekkürler.

sayfa adı: dize, int, karışık dizeler / girişler listesi veya Yok, varsayılan 0 0.21.0 sürümünden beri kullanımdan kaldırıldı: Bunun yerine sayfa_adı kullanın Kaynak Bağlantı


12
en son pandalar (0.20.3), bir haritaya tüm sayfaları okumak için .. tüm gereken df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), bu otomatik olarak bir sözlükte sayfaları olacak .. ve bu gibi veri çerçevesi olarak sayfaya erişmek:df_sheet_map['house']
ihightower

32

Sayfa için dizini de kullanabilirsiniz:

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

ilk çalışma sayfasını verecektir. ikinci çalışma sayfası için:

sheet2 = xls.parse(1)

7
Sayfa adlarının bir listesini istiyorsanız, sadece xls.sheet_names yazın
Stefano Fedele

28

Sayfa adını parametre olarak da belirtebilirsiniz:

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

yalnızca sayfayı yükler "sheet_name".


9
pd.read_excel('filename.xlsx') 

varsayılan olarak çalışma kitabının ilk sayfasını okuyun.

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

belirli çalışma kitabını okuyun ve

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

excel'den panda veri çerçevesine kadar tüm çalışma sayfalarını bir OrderedDict türü olarak okumak, iç içe veri çerçeveleri anlamına gelir, tüm çalışma sayfaları veri çerçevesi içinde toplanan veri çerçeveleri olarak ve türü OrderedDict'tir.


1

Evet maalesef her zaman tam dosyayı yükleyecektir. Bunu tekrar tekrar yapıyorsanız, muhtemelen CSV'leri ayırmak ve ayrı olarak yüklemek için sayfaları çıkarmak en iyisidir. Bu işlemi, tüm sütunların tüm sayfalarda veya birden çok Excel dosyasında eşit olup olmadığını kontrol etme gibi ek özellikler ekleyen d6tstack ile otomatikleştirebilirsiniz .

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

D6tstack Excel örneklerine bakın


0

Excel dosyasını python programınızla (Göreli Adresleme) aynı klasöre kaydettiyseniz, dosya adıyla birlikte sayfa numarasından bahsetmeniz yeterlidir. Sözdizimi = pd.read_excel (Dosya adı, Sayfa No) Örnek:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.