एक ही कार्यपुस्तिका के कई वर्कशीट के लिए pd.read_excel () के लिए पंडों का उपयोग करना


166

मेरे पास एक बड़ी स्प्रेडशीट फ़ाइल (.xlsx) है जिसे मैं अजगर पांडा का उपयोग करके संसाधित कर रहा हूं। ऐसा होता है कि मुझे उस बड़ी फ़ाइल में दो टैब से डेटा चाहिए। टैब में से एक में डेटा का एक टन है और दूसरा सिर्फ कुछ वर्ग कोशिकाएं हैं।

जब मैं किसी भी वर्कशीट पर pd.read_excel () का उपयोग करता हूं , तो यह मुझे ऐसा लगता है जैसे पूरी फ़ाइल लोड हो गई है (न कि केवल उस वर्कशीट में मेरी दिलचस्पी है)। इसलिए जब मैं दो बार (प्रत्येक शीट के लिए एक बार) विधि का उपयोग करता हूं, तो मुझे प्रभावी रूप से पूरी कार्यपुस्तिका को दो बार (भले ही हम केवल निर्दिष्ट शीट का उपयोग कर रहे हों) में भुगतना पड़ता है।

क्या मैं इसका गलत इस्तेमाल कर रहा हूं या यह सिर्फ इस तरह से सीमित है?

धन्यवाद!


जवाबों:


244

कोशिश करें pd.ExcelFile:

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

जैसा कि @HaPantran ने उल्लेख किया है, संपूर्ण एक्सेल फ़ाइल ExcelFile()कॉल के दौरान पढ़ी जाती है (इसके आसपास कोई रास्ता नहीं दिखता है)। यह आपको हर बार एक ही फाइल को पढ़ने से बचाता है, जब आप एक नई शीट एक्सेस करना चाहते हैं।

ध्यान दें कि sheet_nameतर्क pd.read_excel()शीट का नाम (ऊपर के रूप में) हो सकता है, शीट नंबर (उदाहरण 0, 1, आदि) को निर्दिष्ट करने वाला पूर्णांक, शीट नामों या सूचकांकों की सूची या None। यदि एक सूची प्रदान की जाती है, तो यह एक शब्दकोश देता है जहां कुंजियाँ शीट के नाम / सूचकांक हैं और मान डेटा फ़्रेम हैं। डिफ़ॉल्ट बस पहली शीट (यानी, sheet_name=0) वापस करना है।

यदि Noneनिर्दिष्ट किया गया है, तो सभी शीटों को एक {sheet_name:dataframe}शब्दकोश के रूप में वापस कर दिया जाता है ।


4
एफडब्ल्यूआईडब्ल्यू, ऐसा लगता है (पिछली बार जब मैंने इसका परीक्षण किया था) तो हर चीज में पहली पंक्ति लोड होती है , इसलिए कुशलतापूर्वक सिर्फ एक शीट में खींचने का कोई तरीका नहीं है, लेकिन कम से कम कई शीट प्राप्त करने से पूरी शीट के कई लोड की आवश्यकता नहीं होती है।
हप्रपन्त्रन

1
इस उत्तर को पांडा द्वारा हटा दिया गया है और अब v0.21.0 में मेरे लिए क्रैश हो गया है। इसे @ Mat0kan द्वारा दिए गए द्वारा प्रतिस्थापित किया जाना चाहिए।
DStauffman

1
@DStauffman यह अभी भी मेरे लिए ठीक काम करता है और मुझे कोड या डॉक्स से कोई संकेत नहीं दिखता है कि यह पदावनत है। अगर आपको इससे परेशानी हो रही है, तो मैं पिंडास या xlrd (पंडों द्वारा प्रयुक्त अजगर एक्सेल पार्सिंग लाइब्रेरी) के लिए गीथूब पर एक मुद्दा प्रस्तुत करूंगा
नूह

@ नोहा, धन्यवाद मैंने इसमें कुछ और देखा और आप सही हैं, यह तब भी काम करता है जब तक मैं उपयोग करता हूं sheet_nameऔर नहीं करता sheetname। मुझे महसूस नहीं हुआ कि यह पदावनत हिस्सा था, क्योंकि यह अभी भी read_excel पद्धति पर काम कर रहा था, लेकिन पार्स विधि पर नहीं।
DStauffman

@ नोहा वास्तव में एक अच्छा जवाब है। क्या एक्सेल शीट में सक्रिय सेल को खोजने का कोई तरीका है जिसे आप पढ़ते हैं?
इस्वर

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)

@ इशू करने के लिए धन्यवाद @ संकेत और संस्करण मुद्दे को इंगित करने के लिए @toto_tico।

पहली शीट को सीधे डेटाफ्रेम में पढ़ें

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

एक्सेल फ़ाइल पढ़ें और शीट की एक सूची प्राप्त करें। फिर चादरों को चुना और लोड किया।

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 / ints की मिली-जुली लिस्ट, या कोई नहीं, डिफ़ॉल्ट 0 संस्करण 0.21.0 के बाद से घटाया: इसके बजाय sheet_name का उपयोग करें Source Link


12
नवीनतम पांडा में जो मेरे पास है (0.20.3), सभी शीटों को एक नक्शे पर पढ़ने के लिए .. वह सब जो आवश्यक है df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), यह स्वचालित रूप से एक शब्दकोश में पत्रक होगा .. और शीट को df_sheet_map['house']
डेटाफ़्रेम के

32

आप पत्रक के लिए सूचकांक का उपयोग भी कर सकते हैं:

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

पहली वर्कशीट देगा। दूसरी वर्कशीट के लिए:

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) 

एक्सेल से पांडा डेटाफ्रेम तक सभी वर्कशीट को एक प्रकार के ऑर्डरडेडक्ट के रूप में पढ़ें का अर्थ है नेस्टेड डेटाफ्रेम, सभी वर्कशीट को डेटाफ्रेम के अंदर एकत्रित डेटाफ्रेम के रूप में और यह टाइप्डेडडिक्ट है।


1

हाँ दुर्भाग्य से यह हमेशा पूरी फ़ाइल लोड करेगा। यदि आप बार-बार ऐसा कर रहे हैं तो शायद CSV को अलग करने के लिए चादरें निकालना और फिर अलग से लोड करना। आप d6tstack के साथ उस प्रक्रिया को स्वचालित कर सकते हैं जो अतिरिक्त सुविधाओं को जोड़ता है जैसे कि जांचना कि सभी कॉलम सभी शीट या एकाधिक एक्सेल फ़ाइलों के बराबर हैं।

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

D6tstack एक्सेल उदाहरण देखें


0

यदि आपने एक्सेल फाइल को अपने अजगर प्रोग्राम (रिलेटिव एड्रेसिंग) के समान फ़ोल्डर में सेव किया है तो आपको फाइल नाम के साथ सिर्फ शीट नंबर का उल्लेख करना होगा। सिंटैक्स = pd.read_excel (फ़ाइल नाम, 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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.