পান্ডাসের ডেটা ফ্রেমে সারিগুলিতে পুনরাবৃত্তি কীভাবে করবেন?
উত্তরঃ না DO * !
পান্ডাসে আইট্রেটেশন একটি অ্যান্টি-প্যাটার্ন এবং এটি এমন কিছু যা কেবল তখনই আপনার করা উচিত যখন আপনি প্রতিটি অন্যান্য বিকল্প নিঃশেষ করে দেন। iter
কয়েক হাজারেরও বেশি সারি এর জন্য আপনার নামে " " কোনও ফাংশন ব্যবহার করা উচিত নয় বা আপনাকে প্রচুর অপেক্ষায় অভ্যস্ত হতে হবে।
আপনি কি ডেটা ফ্রেম মুদ্রণ করতে চান? ব্যবহার DataFrame.to_string()
।
আপনি কি কিছু গণনা করতে চান? সেক্ষেত্রে এই ক্রমে পদ্ধতিগুলির জন্য অনুসন্ধান করুন (তালিকাটি এখান থেকে সংশোধিত হয়েছে ):
- Vectorization
- সিথনের রুটিনগুলি
- তালিকা সমঝোতা (ভ্যানিলা
for
লুপ)
DataFrame.apply()
: i) সিথনে সঞ্চালনযোগ্য হ্রাস, ii) পাইথন স্পেসে আইট্রেশন
DataFrame.itertuples()
এবং iteritems()
DataFrame.iterrows()
iterrows
এবং itertuples
(এই প্রশ্নের উত্তরে উভয়ই অনেক ভোট গ্রহণ করে) অত্যন্ত বিরল পরিস্থিতিতে যেমন ক্রমযুক্ত প্রসেসিংয়ের জন্য সারি বস্তু / নেমটুপলস তৈরি করা উচিত যা এই ফাংশনগুলির জন্য সত্যই কার্যকর thing
কর্তৃপক্ষের কাছে আবেদন - পুনরাবৃত্তির
ডক্স পৃষ্ঠায় একটি বিশাল লাল সতর্কতা বাক্স রয়েছে যা বলে:
পান্ডাস বস্তুর মাধ্যমে আইট্রেট করা সাধারণত ধীর হয়। অনেক ক্ষেত্রে সারিগুলির উপরে ম্যানুয়ালি পুনরাবৃত্তি করার প্রয়োজন হয় না [...]।
* এটি আসলে "না" এর চেয়ে কিছুটা জটিল। df.iterrows()
এই প্রশ্নের সঠিক উত্তর, তবে "আপনার অপ্টকে ভেক্টরাইজ করুন" আরও ভাল। আমি স্বীকার করব যে এমন পরিস্থিতিতে রয়েছে যেখানে পুনরাবৃত্তি এড়ানো যায় না (উদাহরণস্বরূপ, কিছু অপারেশন যেখানে ফলাফলটি পূর্ববর্তী সারির জন্য গুণিত মানের উপর নির্ভর করে)। তবে কখন তা জানতে গ্রন্থাগারের সাথে কিছুটা পরিচিতি লাগে। আপনার যদি পুনরাবৃত্তি সমাধান প্রয়োজন কিনা তা নিশ্চিত না হন তবে আপনি সম্ভবত তা করবেন না। পিএস: এই উত্তরটি লেখার জন্য আমার যুক্তি সম্পর্কে আরও জানতে, নীচের দিকে যান।
বেশ কয়েকটি বেসিক ক্রিয়াকলাপ এবং গণনাগুলি পান্ডাস দ্বারা "ভেক্টরাইজড" হয় (হয় নুমপি বা সিথোনাইজড ফাংশনগুলির মাধ্যমে)। এর মধ্যে রয়েছে গাণিতিক, তুলনা, (সর্বাধিক) হ্রাস, পুনরায় আকার নির্ধারণ (যেমন পিভোটিং), যোগ দেয় এবং গোষ্ঠীবদ্ধ ক্রিয়াকলাপ includes আপনার সমস্যার জন্য উপযুক্ত ভেক্টরাইজড পদ্ধতিটি খুঁজতে প্রয়োজনীয় বুনিয়াদি কার্যকারিতা সম্পর্কিত ডকুমেন্টেশনটি দেখুন ।
যদি কারও অস্তিত্ব না থাকে তবে কাস্টম সিথন এক্সটেনশনগুলি ব্যবহার করে আপনার নিজেরাই নির্দ্বিধায় লিখুন ।
তালিকা অনুধাবনগুলি আপনার পরবর্তী কলের পোর্ট হওয়া উচিত যদি 1) কোনও ভেক্টরাইজড সমাধান পাওয়া যায় না, 2) পারফরম্যান্স গুরুত্বপূর্ণ, তবে আপনার কোডটি সাইথোনাইজিংয়ের ঝামেলার মধ্য দিয়ে যাওয়ার পক্ষে যথেষ্ট গুরুত্বপূর্ণ নয়, এবং 3) আপনি এলিমিনাইজ ট্রান্সফর্মেশন সম্পাদনের চেষ্টা করছেন আপনার কোডে একটা হল প্রমাণ ভাল পরিমাণ সুপারিশ সেই তালিকাটি comprehensions পর্যাপ্ত ফাস্ট (এবং এমনকি কখনও কখনও দ্রুত) অনেক সাধারণ পান্ডাস কাজের জন্য হয়।
সূত্রটি সহজ,
# iterating over one column - `f` is some function that processes your data
result = [f(x) for x in df['col']]
# iterating over two columns, use `zip`
result = [f(x, y) for x, y in zip(df['col1'], df['col2'])]
# iterating over multiple columns - same data type
result = [f(row[0], ..., row[n]) for row in df[['col1', ...,'coln']].to_numpy()]
# iterating over multiple columns - differing data type
result = [f(row[0], ..., row[n]) for row in zip(df['col1'], ..., df['coln'])]
আপনি যদি আপনার ব্যবসায়িক যুক্তি কোনও ফাংশনে আবদ্ধ করতে পারেন তবে আপনি একটি তালিকা বোঝার জন্য এটি কল করতে পারেন। কাঁচা অজগরটির সরলতা এবং গতির মধ্য দিয়ে আপনি নির্বিচারে জটিল জিনিসগুলি কাজ করতে পারেন।
ক্যাভেটস
তালিকা অনুধাবনগুলি ধরে নিয়েছে যে আপনার ডেটা সাথে কাজ করা সহজ - এর অর্থ কী যা আপনার ডেটা ধরণের এবং সামঞ্জস্যপূর্ণ এবং আপনার এনএএন নেই, তবে এটি সর্বদা গ্যারান্টিযুক্ত হতে পারে না।
- প্রথমটি আরও সুস্পষ্ট, তবে এনএএনদের সাথে কথা বলার সময়, অন্তর্নির্মিত পান্ডা পদ্ধতিগুলি উপস্থিত থাকলে তাদের পছন্দ করুন (কারণ তাদের কাছে কোণার-কেস পরিচালনা করার লজিক রয়েছে), অথবা আপনার ব্যবসায়িক যুক্তিতে উপযুক্ত NaN হ্যান্ডলিং যুক্তি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন।
- মিশ্র ডেটা প্রকারের সাথে ডিল করার সময় আপনার উত্তরটির
zip(df['A'], df['B'], ...)
পরিবর্তে পুনরাবৃত্তি করা উচিত df[['A', 'B']].to_numpy()
কারণ পরেরটি সুস্পষ্টভাবে সবচেয়ে সাধারণ ধরণের ডেটা আপকাস্ট করে। উদাহরণ হিসাবে যদি A সংখ্যাসূচক হয় এবং B স্ট্রিং হয় to_numpy()
তবে পুরো অ্যারেটিকে স্ট্রিংয়ে ফেলে দেবে, যা আপনি চান তা নাও হতে পারে। ভাগ্যক্রমে zip
আপনার কলামগুলির একসাথে পিং করা এটির পক্ষে সবচেয়ে সহজ কাজ।
* উপরের ক্যাভেটস বিভাগে বর্ণিত কারণগুলির জন্য ওয়াইএমএমভি ।
একটি স্পষ্ট উদাহরণ
আসুন দুটি পান্ডাস কলাম যুক্ত করার একটি সাধারণ উদাহরণ দিয়ে পার্থক্যটি দেখান A + B
। এটি একটি ভেক্টরাইজযোগ্য অপারেটন, সুতরাং উপরে বর্ণিত পদ্ধতিগুলির পারফরম্যান্সের বিপরীতে কাজ করা সহজ হবে।
আপনার রেফারেন্সের জন্য বেঞ্চমার্কিং কোড।
আমার অবশ্য উল্লেখ করা উচিত যে এটি সর্বদা এই কাটা এবং শুকনো হয় না। কখনও কখনও "অপারেশনের সর্বোত্তম পদ্ধতি কী" এর উত্তর "এটি আপনার ডেটার উপর নির্ভর করে"। আমার পরামর্শ হ'ল কোনওটিতে স্থির হওয়ার আগে আপনার ডেটা সম্পর্কে বিভিন্ন পদ্ধতির পরীক্ষা করা।
আরও পড়া
* পান্ডাস স্ট্রিং পদ্ধতিগুলি "ভেক্টরাইজড" এই অর্থে যে তারা সিরিজে নির্দিষ্ট করা হয়েছে তবে প্রতিটি উপাদানকে চালিত করে। অন্তর্নিহিত প্রক্রিয়াগুলি এখনও পুনরুক্তিযোগ্য, কারণ স্ট্রিং অপারেশনগুলি ভেক্টরাইজ করা স্বভাবতই শক্ত।
আমি কেন এই উত্তরটি লিখেছি
নতুন ব্যবহারকারীর কাছ থেকে আমি একটি সাধারণ প্রবণতা লক্ষ্য করি তা হল "আমি কীভাবে আমার ডিএফ দিয়ে এক্স করতে পারি?" ফর্মটির প্রশ্ন জিজ্ঞাসা করা। iterrows()
লুপের জন্য কিছু করার সময় যে কোডগুলি কল করে তা দেখানো হচ্ছে । এখানে কেন। গ্রন্থাগারের একজন নতুন ব্যবহারকারী যিনি ভেক্টরাইজেশন ধারণার সাথে পরিচিত হননি তারা সম্ভবত কোডটি কল্পনা করবে যা তাদের সমস্যাটি সমাধান করে যেহেতু কিছু করার জন্য তাদের ডেটা নিয়ে পুনরাবৃত্তি করে as কোনও ডেটাফ্রেমের মাধ্যমে কীভাবে পুনরাবৃত্তি করা যায় তা না জানা, তারা প্রথম কাজটি গুগল করে এবং এই প্রশ্নে এখানেই শেষ হয়। তারপরে তারা গ্রহণযোগ্য উত্তর তাদের কীভাবে বলবে তা দেখেন এবং তারা চোখ বন্ধ করে এবং পুনরাবৃত্তিটি সঠিকভাবে করা ঠিক না যদি কোনও প্রশ্ন না করে এই কোড চালায় run
এই উত্তরের লক্ষ্যটি নতুন ব্যবহারকারীদের বুঝতে সাহায্য করা যে পুনরাবৃত্তি প্রতিটি সমস্যার সমাধান নয়, এবং এটি আরও ভাল, দ্রুত এবং আরও বেশি বুদ্ধিমানের সমাধান থাকতে পারে এবং সেগুলি অন্বেষণে সময় বিনিয়োগের পক্ষে উপযুক্ত। আমি পুনরুদ্ধার বনাম ভেক্টরাইজেশন যুদ্ধ শুরু করার চেষ্টা করছি না, তবে আমি চাই নতুন গ্রাহকদের এই লাইব্রেরিতে তাদের সমস্যার সমাধানের বিকাশের সময় অবহিত করা উচিত।