পান্ডাদের সাথে, আপনি সম্ভবত এই ক্লাসিক বিভ্রান্তিতে আটকে আছেন: আপনার এটি ব্যবহার করা উচিত? loc বা iloc ডেটা বের করতে? প্রথম নজরে, তারা প্রায় অভিন্ন দেখায়। উভয়ই ডেটাফ্রেম থেকে সারি বা কলামগুলিকে ছাঁটাই, ফিল্টার এবং পুনরুদ্ধার করতে ব্যবহৃত হয় – তবুও তারা যেভাবে কাজ করে তার একটি ছোট পার্থক্য আপনার ফলাফলগুলিকে সম্পূর্ণরূপে পরিবর্তন করতে পারে (বা এমন একটি ত্রুটি তৈরি করে যা আপনার মাথা ঘামাবে)।
আমার মনে আছে প্রথমবার আমি একটি সারি নির্বাচন করার চেষ্টা করেছি df.loc[0] এবং বিস্মিত কেন এটা কাজ করে না. কারণ? পান্ডা সবসময় অবস্থানের পরিপ্রেক্ষিতে “চিন্তা” করে না – কখনও কখনও এটি লেবেল ব্যবহার করে। এটা ঠিক এখানে loc বনাম iloc পার্থক্য আছে।
এই নিবন্ধে, আমি একটি ছোট স্টুডেন্ট পারফরম্যান্স ডেটাসেট ব্যবহার করে একটি সাধারণ মিনি প্রকল্পের মাধ্যমে আপনাকে হেঁটে দেব। শেষ পর্যন্ত, আপনি শুধুমাত্র মধ্যে পার্থক্য বুঝতে পারবেন না loc এবং ilocতবে আপনার ডেটা বিশ্লেষণে প্রতিটি কখন ব্যবহার করতে হবে তাও জানুন।
ডেটাসেটের ভূমিকা
ডেটাসেটটি ChatGPT থেকে আসে। এতে কিছু প্রাথমিক ছাত্র পরীক্ষার স্কোর রেকর্ড রয়েছে। এখানে আমাদের ডেটাসেটের একটি স্ন্যাপশট রয়েছে
import pandas as pd
df = pd.read_csv(‘student_scores.csv’)
df
আউটপুট:

আমি loc এবং iloc ব্যবহার করে কিছু ডেটা নিষ্কাশনের কাজ করার চেষ্টা করব, যেমন
- একটি ডেটাফ্রেম থেকে একটি সারি সরানো হচ্ছে
- একক মান খুঁজুন
- একাধিক সারি সরান
- লাইন একটি সিরিজ কাটা
- নির্দিষ্ট কলাম অপসারণ এবং
বুলিয়ান ফিল্টারিং
প্রথমে, পান্ডাগুলিতে loc এবং iloc কী রয়েছে তা আমি সংক্ষেপে ব্যাখ্যা করি।
লোক এবং ইলোক কি
Loc এবং iloc পান্ডাদের ডেটা নিষ্কাশনের কৌশল রয়েছে। তারা রেকর্ড থেকে ডেটা নির্বাচন করতে বেশ সহায়ক।
Loc একটি ডেটাফ্রেম থেকে রেকর্ড পুনরুদ্ধার করতে লেবেল ব্যবহার করে, তাই আমি এটি ব্যবহার করা সহজ বলে মনে করি। যাইহোক, Iloc রেকর্ডের আরও সঠিক পুনরুদ্ধারের জন্য সহায়ক, কারণ iloc সারি এবং কলামের পূর্ণসংখ্যা অবস্থানের উপর ভিত্তি করে ডেটা নির্বাচন করে, যেভাবে আপনি পাইথন তালিকা বা অ্যারেকে সূচী করেন।
কিন্তু আপনি যদি আমার মতো হন তবে আপনি হয়তো ভাবছেন। যদি সারি লেবেলের কারণে loc স্পষ্টতই সহজ হয়, কেন iloc ব্যবহার করে বিরক্ত? কেন সারি সূচকগুলি বের করার চেষ্টা করবেন, বিশেষ করে যদি আপনি বড় ডেটাসেটের সাথে কাজ করছেন? এখানে কিছু কারণ আছে।
- অনেক সময়, ডেটাসেটগুলি পরিষ্কার সারি সূচকের সাথে আসে না (যেমন 101, 102,…)। পরিবর্তে, আপনার একটি প্লেইন ইনডেক্স আছে (
0, 1, 2, …), অথবা রেকর্ড পুনরুদ্ধার করার সময় আপনি সারি লেবেলিং ভুল বানান করতে পারেন। এই ক্ষেত্রে, আপনি iloc ব্যবহার করা ভাল। পরে এই নিবন্ধে, আমরা এটিও আলোচনা করব। - কিছু পরিস্থিতিতে, যেমন মেশিন লার্নিং প্রিপ্রসেসিং, লেবেলগুলি আসলেই গুরুত্বপূর্ণ নয়। আপনি শুধুমাত্র তথ্যের স্ন্যাপশট সম্পর্কে যত্নশীল. যেমন প্রথম বা শেষ তিনটি রেকর্ড। iloc এই পরিস্থিতিতে সত্যিই সহায়ক।
ilocকোডকে ছোট এবং কম ভঙ্গুর করে তোলে, বিশেষ করে যদি লেবেল পরিবর্তন হয়, যা আপনার মেশিন লার্নিং মডেলকে ভেঙে দিতে পারে - অনেক ডেটাসেটের ডুপ্লিকেট সারি লেবেল আছে। এই ক্ষেত্রে,
ilocসর্বদা কাজ করে কারণ অবস্থানগুলি অনন্য। - নীচের লাইনটি হল loc ব্যবহার করা যখন আপনার ডেটাসেটে স্পষ্ট, অর্থপূর্ণ লেবেল থাকে এবং আপনি চান যে আপনার কোড পাঠযোগ্য হোক।
- যখন আপনার অবস্থান-ভিত্তিক নিয়ন্ত্রণের প্রয়োজন হয়, বা যখন লেবেলগুলি অনুপস্থিত/বিশৃঙ্খল থাকে তখন iloc ব্যবহার করুন।
এখন যেহেতু আমি সবকিছু সাফ করেছি, নীচে loc এবং iloc এর জন্য মৌলিক সিনট্যাক্স রয়েছে:
df.loc[rows, columns]
df.iloc[rows, columns]
সিনট্যাক্স প্রায় একই. এই সিনট্যাক্সের সাহায্যে, আসুন loc এবং iloc ব্যবহার করে কিছু রেকর্ড পুনরুদ্ধার করার চেষ্টা করি।
একটি ডেটাফ্রেম থেকে একটি সারি সরানো হচ্ছে
সঠিক পারফরম্যান্সের জন্য, প্রথমে কলামের সূচী পরিবর্তন করে ছাত্র_আইডি করা যাক। বর্তমানে, পান্ডা স্বতঃ-সূচীকরণ করছে:
# setting student_id as index
df.set_index('student_id', inplace=True)
এখানে আউটপুট আছে:

ভাল দেখায় এখন, ববের সমস্ত রেকর্ড পুনরুদ্ধার করার চেষ্টা করা যাক। Loc ব্যবহার করে এটি কীভাবে অ্যাক্সেস করবেন তা এখানে:
df.loc[102]
আমি এখানে শুধুমাত্র সারি লেবেল উল্লেখ করছি। এটি ববের সমস্ত রেকর্ড পুনরুদ্ধার করা উচিত৷
এখানে আউটপুট আছে:
name Bob
math 58
english 64
science 70
Name: 102, dtype: object
এই সম্পর্কে চমৎকার জিনিস হল যে আমি ড্রিল ডাউন করতে পারি, একটি অনুক্রমের মতো। উদাহরণস্বরূপ, আসুন বব সম্পর্কে নির্দিষ্ট তথ্য পাওয়ার চেষ্টা করি, যেমন গণিতে তার স্কোর।
df.loc[102, ‘math’]
আউটপুট হবে 58.
এখন এটা চেষ্টা করা যাক iloc. আপনি যদি তালিকা এবং অ্যারেগুলির সাথে পরিচিত হন, ইনডেক্সিং সর্বদা 0 থেকে শুরু হয়। তাই যদি আমি ডেটাফ্রেমের প্রথম রেকর্ডটি পুনরুদ্ধার করতে চাই, তাহলে আমাকে সূচক 0 উল্লেখ করতে হবে। এই ক্ষেত্রে, আমি বব পুনরুদ্ধার করার চেষ্টা করছি, যা আমাদের ডেটাফ্রেমের দ্বিতীয় সারি – তাই, এই ক্ষেত্রে, সূচকটি 1 হবে।
df.iloc[1]
আমরা উপরের মত একই আউটপুট পাব:
name Bob
math 58
english 64
science 70
Name: 102, dtype: object
এবং যদি আমি আরও গভীর খনন করার চেষ্টা করি এবং ববের গণিত স্কোরগুলি পুনরুদ্ধার করি। আমাদের সূচকটিও 1 হবে, গণিতটি দ্বিতীয় সারিতে রয়েছে
df.iloc[1, 1]
আউটপুট হবে 58.
ঠিক আছে, আমি এই নিবন্ধটি এখানে শেষ করতে পারি, তবে loc এবং iloc কিছু আরও চিত্তাকর্ষক বৈশিষ্ট্য সরবরাহ করে। আসুন দ্রুত তাদের কিছু মাধ্যমে চালানো যাক.
একাধিক সারি সরান (নির্দিষ্ট ছাত্র)
পান্ডাস আপনাকে loc এবং iloc ব্যবহার করে একাধিক সারি পুনরুদ্ধার করতে দেয়। আমি বেশ কয়েকজন ছাত্রের রেকর্ড পুনরুদ্ধার করে একটি প্রদর্শন করতে যাচ্ছি। এই ক্ষেত্রে, আমাদের loc/iloc পদ্ধতিতে একটি একক মান সংরক্ষণ করার পরিবর্তে, আমরা একটি তালিকা সংরক্ষণ করব। আপনি কীভাবে loc দিয়ে এটি করতে পারেন তা এখানে:
# Alice, Charlie and Edward's records
df.loc[[101, 103, 105]]
এখানে আউটপুট আছে:

এবং এখানে কিভাবে যে করতে iloc::
df.iloc[[0, 2, 4]]
আমরা একই আউটপুট পাব:

আমি আশা করি আপনি এটি বুঝতে পেরেছেন।
লাইন একটি সিরিজ কাটা
Python Pandas দ্বারা প্রদত্ত আরেকটি দরকারী বৈশিষ্ট্য হল লাইনের একটি পরিসীমা কাটার ক্ষমতা। এখানে, আপনি আপনার শুরু এবং শেষ অবস্থান নির্দিষ্ট করতে পারেন। এখানে loc/iloc স্লাইসিংয়ের জন্য সিনট্যাক্স রয়েছে:
df.loc[start_label:end_label]
ইন locযাইহোক, শেষ লেবেলটি আউটপুটে অন্তর্ভুক্ত করা হবে – ডিফল্ট পাইথন স্লাইসিং থেকে বেশ ভিন্ন।
সিনট্যাক্স অনুরূপ ilocবাদ দিয়ে শেষ লেবেলটি আউটপুট থেকে বাদ দেওয়া হবে (যেমন ডিফল্ট পাইথন স্লাইসিং)।
আসুন একটি উদাহরণ দিয়ে যাওয়া যাক:
আমি একাধিক ছাত্র রেকর্ড পুনরুদ্ধার করার চেষ্টা করছি. এর চেষ্টা করা যাক loc::
df.loc[101:103]
আউটপুট:

আপনি উপরে দেখতে পারেন, চূড়ান্ত লেবেল ফলাফল অন্তর্ভুক্ত করা হয়েছে. এখন, এই চেষ্টা করা যাক iloc. মনে রাখলে প্রথম সারির ইনডেক্স হবে ০, মানে তৃতীয় সারি হবে 2।
df.iloc[0:3]
আউটপুট:

এখানে, তৃতীয় লাইনটি বাদ দেওয়া হয়েছে। কিন্তু আপনি যদি আমার মতো হন (যে ব্যক্তি অনেক প্রশ্ন করেন), আপনি হয়তো ভাবছেন, কেন আপনি শেষ লাইন বাদ দিতে চান? কোন পরিস্থিতিতে এটি সহায়ক হবে? যদি আমি আপনাকে বলি যে এটি সত্যিই আপনার জীবনকে সহজ করে তোলে? চলুন এখনই এটি পরিষ্কার করা যাক।
ধরা যাক আপনি 100 সারির অংশে আপনার ডেটাফ্রেম প্রক্রিয়া করতে চান।
যদি স্লাইসিং জড়িত থাকে তবে শেষ লাইনের পুনরাবৃত্তি এড়াতে আপনাকে কিছু অদ্ভুত গণিত করতে হবে।
কিন্তু যেহেতু স্লাইসিং শেষের দিকে বিশেষ, তাই আপনি এটি খুব সহজেই করতে পারেন।
df.iloc[0:100] # first 100 rows
df.iloc[100:200] # next 100 rows
df.iloc[200:300] # next 100 rows
এখানে, কোন ওভারল্যাপ হবে না, এবং সামঞ্জস্যপূর্ণ খণ্ড আকার. দ্বিতীয় কারণ হল যে এটি পান্ডাসে রেঞ্জের কাজ করার পদ্ধতির মতো। সাধারণত, আপনি যখন সারিগুলির একটি পরিসর পুনরুদ্ধার করতে চান, তখন এটি 0 থেকে শুরু হয় এবং শেষ সারিটি অন্তর্ভুক্ত করে না। eloc স্লাইসিং-এ এই একই যুক্তি থাকা সত্যিই সহায়ক, বিশেষ করে যখন আপনি কিছু ওয়েব স্ক্র্যাপিং করছেন বা বিভিন্ন সারি দিয়ে লুপ করছেন।
নির্দিষ্ট কলাম সরান (বিষয়)
আমি আপনাকে কোলনের সাথে পরিচয় করিয়ে দিতে চাই : সংকেত। এটি আপনাকে loc ব্যবহার করে আপনার ডেটাফ্রেমের সমস্ত রেকর্ড পুনরুদ্ধার করতে দেয়। অনুরূপ * এসকিউএল-এ। এই সম্পর্কে চমৎকার জিনিস হল যে আপনি ফিল্টার করতে পারেন এবং কলামের উপসেটগুলি বাদ দিতে পারেন।
এটি সাধারণত যেখানে আমি শুরু করি। আমি একটি নির্দিষ্ট ডেটাসেটের একটি ওভারভিউ পেতে এটি ব্যবহার করি। সেখান থেকে, আমি ফিল্টারিং এবং ড্রিলিং শুরু করতে পারি। আমি কি বলতে চাইছি তা দেখান।
চলুন সব রেকর্ড পুনরুদ্ধার করা যাক:
df.loc[:]
আউটপুট:

এখান থেকে, আমি এই জাতীয় নির্দিষ্ট কলামগুলি সরাতে পারি। অবস্থান সহ:
df.loc[:, [‘math’, ‘science’]]
আউটপুট:

সঙ্গে iloc::
df.iloc[:, [2, 4]]
আউটপুট একই হবে।
আমি এই বৈশিষ্ট্যটি পছন্দ করি কারণ এটি খুব নমনীয়। ধরা যাক আমি অ্যালিস এবং ববের গণিত এবং বিজ্ঞানের স্কোর পুনরুদ্ধার করতে চাই। এটা এরকম কিছু হবে। আমি শুধুমাত্র রেকর্ড এবং কলামের পরিসীমা নির্দিষ্ট করতে পারি যা আমি চাই।
সঙ্গে loc::
df.loc[101:103, ['name', 'math', 'science']]
আউটপুট:

ইলোকের সাথে:
df.iloc[0:3, [0, 1, 3]]
আমরা একই আউটপুট পাব।
বুলিয়ান ফিল্টারিং (কে গণিতে 80 এর বেশি নম্বর পেয়েছে?)
শেষ বৈশিষ্ট্যটি আমি আপনার সাথে শেয়ার করতে চাই তা হল বুলিয়ান ফিল্টারিং। এটি আরও নমনীয় নিষ্কাশন অনুমতি দেয়। ধরুন আমি গণিতে 80 এর উপরে স্কোর করা ছাত্রদের রেকর্ড পুনরুদ্ধার করতে চাই। সাধারণত, SQL এ, আপনাকে WHERE এবং HAVING ক্লজ ব্যবহার করতে হবে। পাইথন এটি খুব সহজ করে তোলে।
# Students with Math > 80.
df.loc[df['math'] > 80]
আউটপুট:

এছাড়াও আপনি AND(&), OR(|), এবং NOT(~) অপারেটর ব্যবহার করে একাধিক শর্তে ফিল্টার করতে পারেন। যেমন:
# Math > 70 and Science > 80
df.loc[(df[‘math’] > 70) & (df[‘science’] > 80)]
আউটপুট:
PS আমি পান্ডাদের সাথে ফিল্টার করার উপর একটি নিবন্ধ লিখেছিলাম। আপনি এখানে এটি পড়তে পারেন
সাধারণত, আপনি নিজেকে লোকের সাথে এই বৈশিষ্ট্যটি ব্যবহার করতে পাবেন। এটি একটু জটিল হতে পারে ilocকারণ এটি বুলিয়ান অবস্থাকে সমর্থন করে না। eloc দিয়ে এটি করতে, আপনাকে বুলিয়ান ফিল্টারিংকে একটি তালিকায় রূপান্তর করতে হবে, যেমন:
# Students with Math > 80.
df.iloc[list(df['math'] > 80)]
মাথাব্যথা এড়াতে শুধু এগিয়ে যান loc.
উপসংহার
আপনি সম্ভবত ব্যবহার করবেন loc এবং iloc আপনি যখন একটি ডেটাসেটে কাজ করছেন তখন প্রচুর পদ্ধতি। সুতরাং তারা কীভাবে কাজ করে এবং কীভাবে দুটির মধ্যে পার্থক্য করা যায় তা জানা গুরুত্বপূর্ণ। আমি পছন্দ করি যে এই পদ্ধতিগুলি দিয়ে রেকর্ডগুলি সরানো কতটা সহজ এবং নমনীয়। যখনই আপনি বিভ্রান্ত হন, শুধু মনে রাখবেন যে loc সবই লেবেল সম্পর্কে যেখানে iloc হল অবস্থান সম্পর্কে।
আমি আশা করি আপনি এই নিবন্ধটি দরকারী খুঁজে পেয়েছেন. কর্মের পার্থক্য দেখতে আপনার ডেটাসেটে এই উদাহরণগুলি চালানোর চেষ্টা করুন।
আমি এই নিবন্ধগুলি লিখি একটি উপায় হিসাবে আমার প্রযুক্তিগত ধারণাগুলির বোঝার পরীক্ষা এবং শক্তিশালী করার জন্য – এবং আমি যা শিখছি তা অন্যদের সাথে ভাগ করে নেওয়ার জন্য যারা একই পথে থাকতে পারে৷ অন্যদের সাথে শেয়ার করতে নির্দ্বিধায়. আসুন একসাথে শিখি এবং বড় হই। উত্সাহিত করতে!
এই প্ল্যাটফর্মগুলির যেকোনো একটিতে হ্যালো বলতে নির্দ্বিধায়
মাঝারি
লিঙ্কডইন
টুইটার
ইউটিউব