একই ওয়ার্কবুকের একাধিক ওয়ার্কশিটের জন্য pd.read_excel () এ পান্ডাস ব্যবহার করা


165

আমার কাছে একটি বড় স্প্রেডশিট ফাইল (.xlsx) রয়েছে যা আমি পাইথন পান্ডাস ব্যবহার করে প্রক্রিয়া করছি। এটি ঘটেছিল যে বড় ফাইলটিতে আমার দুটি ট্যাব থেকে ডেটা দরকার। ট্যাবগুলির একটিতে একটি টন ডেটা রয়েছে এবং অন্যটি কেবল কয়েকটি বর্গ কোষ।

যখন আমি ব্যবহার pd.read_excel () উপর কোন কার্যপত্রকের, এটা পুরো ফাইল মত (শুধুমাত্র কার্যপত্রকের আমি আগ্রহী) লোড হয় আমাকে বলে মনে হচ্ছে। সুতরাং যখন আমি এই পদ্ধতিটি দু'বার ব্যবহার করি (প্রতিটি শীটের জন্য একবার), তখন কার্যকরভাবে পুরো ওয়ার্কবুকটি দু'বার পড়ার জন্য ভোগ করতে হবে (যদিও আমরা কেবল নির্দিষ্ট শিটটি ব্যবহার করছি)।

আমি কি এটি ভুল ব্যবহার করছি বা এটি কেবল এইভাবে সীমাবদ্ধ?

ধন্যবাদ!


উত্তর:


243

চেষ্টা করুন pd.ExcelFile:

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

@ হাইপস্যানট্রন দ্বারা উল্লিখিত হিসাবে, পুরো এক্সেল ফাইলটি ExcelFile()কল চলাকালীন পঠিত হয় (এটি কোনও উপায় বলে মনে হয় না)। আপনি যখনই একটি নতুন পত্রকে অ্যাক্সেস করতে চান কেবল তখনই একই ফাইলটি পড়া থেকে এটি আপনাকে বাঁচায়।

মনে রাখবেন যে sheet_nameআর্গুমেন্টটি pd.read_excel()শীটের নাম হতে পারে (উপরে হিসাবে), একটি পূর্ণসংখ্যা শিট নম্বর নির্দিষ্ট করে (যেমন 0, 1, ইত্যাদি), শীটের নাম বা সূচকগুলির একটি তালিকা, বা None। যদি কোনও তালিকা সরবরাহ করা থাকে তবে এটি একটি অভিধান প্রদান করে যেখানে কীগুলি শীটের নাম / সূচক এবং মানগুলি ডেটা ফ্রেম হয়। ডিফল্টটি হ'ল প্রথম শীটটি (যেমন, sheet_name=0) ফিরে আসা ।

যদি Noneউল্লেখিত থাকে, তবে সব শীট একটি হিসেবে ফিরিয়ে আনা হয় {sheet_name:dataframe}অভিধান।


4
এফডাব্লুআইডাব্লু, দেখে মনে হচ্ছে (সর্বশেষে প্রথমবারের মতো এটি পরীক্ষা করে নিয়েছি) সবকিছুতে প্রথম লাইনটি লোড হয় , সুতরাং কেবলমাত্র একটি একক শীটে দক্ষতার সাথে টানানোর কোনও উপায় নেই, তবে কমপক্ষে একাধিক শীট পাওয়ার জন্য পুরো শীটের একাধিক বোঝার প্রয়োজন নেই।
এইএপ্পসন্ত্রন

1
এই উত্তরটি পান্ডাস দ্বারা অবহেলা করা হয়েছে এবং এখন আমার জন্য v0.21.0 এ ক্র্যাশ হয়ে গেছে। এটি @ ম্যাট0কান দ্বারা প্রদত্ত একটি দ্বারা প্রতিস্থাপন করা উচিত।
ডিএসটাউফম্যান

1
@ ডিস্টাফম্যান এটি এখনও আমার পক্ষে ভাল কাজ করে এবং কোড বা ডক্স থেকে এটি হ্রাস করা হয়নি বলে আমি কোনও ইঙ্গিত দেখতে পাচ্ছি না। যদি আপনার এতে সমস্যা হয় তবে আমি গিথুবকে পান্ডা বা এক্সএলআরডি (পাইডন এক্সেল পার্সিং গ্রন্থাগার পান্ডার দ্বারা ব্যবহৃত)
নোহ

@ নোহ, ধন্যবাদ আমি এটিকে আরও কিছুটা দেখেছি এবং আপনি ঠিক বলেছেন, এটি যতক্ষণ sheet_nameনা আমি ব্যবহার করি এবং না করি ততক্ষণ কাজ করে sheetname। আমি বুঝতে পারি নি যে এটি অবহিত অংশ ছিল, কারণ এটি এখনও পঠন-এক্সেল পদ্ধতিতে কাজ করে, তবে পার্স পদ্ধতিতে নয়।
ডিএসটাউফম্যান

@ নোয়া সত্যই একটি দুর্দান্ত উত্তর। আপনি যে এক্সেল শিটটি পড়েছেন তাতে সক্রিয় সেলটি খুঁজে পাওয়ার কোনও উপায় আছে কি?
এশওয়ার

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)

এটি নির্দেশ করার জন্য @ আইহাইটওয়ার এবং সংস্করণ ইস্যুটি নির্দেশ করার জন্য @ টোটো_টিকো ধন্যবাদ Thanks

সরাসরি ডেটাফ্রেমে প্রথম শীটটি পড়ুন

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)

আপডেট: সংস্করণ ইস্যুটি নির্দেশ করার জন্য @ টোটো_টিকো ধন্যবাদ।

শিটনাম: স্ট্রিং, ইনট, স্ট্রিং / ইনটসের মিশ্র তালিকা বা কোনও কিছুই নেই, ডিফল্ট 0 0 সংস্করণ 0.21.0 থেকে অবনতি হয়েছে: পরিবর্তে শিট_নাম ব্যবহার করুন উত্স লিঙ্ক


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 টাইপ না করে শিটের নামের একটি তালিকা চান
স্টেফানো ফেডেল

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 গুলি আলাদা করতে শিটগুলি বের করার জন্য সর্বোত্তমভাবে চেষ্টা করুন এবং তারপরে পৃথকভাবে লোড করুন। আপনি ডি 6 টিস্ট্যাকের সাহায্যে সেই প্রক্রিয়াটি স্বয়ংক্রিয় করতে পারেন যা অতিরিক্ত বৈশিষ্ট্য যুক্ত করে যা চেক বা একাধিক এক্সেল ফাইলের মধ্যে সমস্ত কলামগুলি সমান কিনা তা পরীক্ষা করে।

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

দেখুন d6tstack এক্সেল উদাহরণ


0

আপনি যদি অজগর প্রোগ্রামের মতো একই ফোল্ডারে এক্সেল ফাইলটি সংরক্ষণ করেন (সম্পর্কিত ঠিকানা) তবে আপনার কেবল ফাইলের নাম সহ শীট নম্বর উল্লেখ করতে হবে। সিনট্যাক্স = পিডি.ড্রেড_এক্সেল (ফাইলের নাম, শিটনো) উদাহরণ:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.