पंडों में एक DataFrame में पंक्तियों पर पुनरावृति कैसे करें?
उत्तर: नहीं * !
पांडा में गर्भाधान एक विरोधी पैटर्न है, और कुछ ऐसा है जो आपको केवल तभी करना चाहिए जब आपने हर दूसरे विकल्प को समाप्त कर दिया हो। आपको iter
कुछ हज़ार से अधिक पंक्तियों के लिए इसके नाम के साथ किसी भी फ़ंक्शन का उपयोग नहीं करना चाहिए या आपको बहुत प्रतीक्षा करने की आदत डालनी होगी।
क्या आप DataFrame प्रिंट करना चाहते हैं? का उपयोग करें DataFrame.to_string()
।
क्या आप कुछ गणना करना चाहते हैं? उस स्थिति में, इस क्रम में विधियों की खोज करें (सूची यहाँ से संशोधित ):
- vectorization
- साइथॉन दिनचर्या
- सूची समझ (वेनिला
for
लूप)
DataFrame.apply()
: i) साइथन में घटाई जा सकती है, ii) अजगर स्थान में परिवर्तन
DataFrame.itertuples()
तथा iteritems()
DataFrame.iterrows()
iterrows
और itertuples
(इस प्रश्न के उत्तर में कई वोट प्राप्त करने वाले दोनों) का उपयोग बहुत ही दुर्लभ परिस्थितियों में किया जाना चाहिए, जैसे कि क्रमिक प्रसंस्करण के लिए पंक्ति वस्तु / nametuples उत्पन्न करना, जो वास्तव में केवल एक चीज है जो इन कार्यों के लिए उपयोगी है।
प्राधिकरण के पास अपील पर
डॉक्स पृष्ठ में एक बड़ा लाल चेतावनी बॉक्स है जो कहता है:
पंडों की वस्तुओं के माध्यम से Iterating आमतौर पर धीमा है। कई मामलों में, पंक्तियों पर मैन्युअल रूप से पुनरावृत्ति की आवश्यकता नहीं होती है [...]।
* यह वास्तव में "नहीं" की तुलना में थोड़ा अधिक जटिल है। df.iterrows()
इस प्रश्न का सही उत्तर है, लेकिन "अपने ऑप्स को वेक्टर करें" बेहतर है। मैं यह स्वीकार करूंगा कि ऐसी परिस्थितियां हैं जहां पुनरावृत्ति से बचा नहीं जा सकता है (उदाहरण के लिए, कुछ संचालन जहां परिणाम पिछली पंक्ति के लिए गणना किए गए मूल्य पर निर्भर करता है)। हालाँकि, यह जानने के लिए पुस्तकालय के साथ कुछ परिचितता लेता है। यदि आपको यकीन नहीं है कि आपको पुनरावृत्त समाधान की आवश्यकता है, तो आप शायद नहीं। पुनश्च: इस उत्तर को लिखने के लिए मेरे औचित्य के बारे में अधिक जानने के लिए, नीचे की ओर जाएं।
लूपिंग की तुलना में तेज़: वेक्टरकरण , साइथन
बुनियादी कार्यों और संगणनाओं की एक अच्छी संख्या पांडा द्वारा (या तो NumPy के माध्यम से, या Cythonized कार्यों के माध्यम से "सदिश" है)। इसमें अंकगणित, तुलनाएं, (अधिकांश) कटौती, पुनर्वसन (जैसे कि धुरी), जुड़ना और समूह संचालन शामिल हैं। अपनी समस्या के लिए एक उपयुक्त सदिश विधि खोजने के लिए आवश्यक बुनियादी कार्यक्षमता पर प्रलेखन के माध्यम से देखें ।
यदि कोई भी मौजूद नहीं है, तो कस्टम साइथन एक्सटेंशन का उपयोग करके अपना स्वयं का लिखने के लिए स्वतंत्र महसूस करें ।
अगली सर्वश्रेष्ठ बात: सूची की समझ *
सूची की समझ आपके कॉल का अगला पोर्ट होना चाहिए अगर 1) कोई सदिश समाधान उपलब्ध नहीं है, 2) प्रदर्शन महत्वपूर्ण है, लेकिन इतना महत्वपूर्ण नहीं है कि आप अपने कोड को साइथोनाइजिंग की परेशानी से गुजरें, और 3) आप तत्व परिवर्तन करने की कोशिश कर रहे हैं अपने कोड पर। कई सामान्य पंडों के कार्यों के लिए यह सुनिश्चित करने के लिए प्रमाणों की एक अच्छी मात्रा है कि सूची की समझ पर्याप्त रूप से तेज (और कभी-कभी तेज भी) है।
सूत्र सरल है,
# 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 नहीं हैं, लेकिन यह हमेशा गारंटी नहीं दे सकता है।
- पहले वाला अधिक स्पष्ट है, लेकिन NaN के साथ काम करते समय, यदि वे मौजूद हैं (क्योंकि उनके पास बेहतर कॉर्नर-केस हैंडलिंग लॉजिक है) में इन-बिल्ट पांडा तरीके पसंद करते हैं, या सुनिश्चित करें कि आपके व्यावसायिक तर्क में उपयुक्त NaN हैंडलिंग लॉजिक शामिल है।
- जब मिश्रित डेटा प्रकार के साथ काम कर तुम पर पुनरावृति करना चाहिए
zip(df['A'], df['B'], ...)
बजाय df[['A', 'B']].to_numpy()
बाद के रूप में परोक्ष सबसे आम प्रकार के डेटा upcasts। एक उदाहरण के रूप में यदि ए संख्यात्मक है और बी स्ट्रिंग है, to_numpy()
तो पूरे सरणी को स्ट्रिंग में डाल देगा, जो कि आप नहीं चाहते हैं। सौभाग्य से zip
अपने स्तंभों को एक साथ जोड़कर यह सबसे सीधा काम है।
* उपरोक्त केविट्स सेक्शन में उल्लिखित कारणों के लिए YMMV ।
एक स्पष्ट उदाहरण
आइए दो पांडा स्तंभों को जोड़ने के एक सरल उदाहरण के साथ अंतर प्रदर्शित करते हैं A + B
। यह एक वेक्टर करने योग्य ऑपरटन है, इसलिए ऊपर चर्चा की गई विधियों के प्रदर्शन के विपरीत करना आसान होगा।
आपके संदर्भ के लिए बेंचमार्किंग कोड।
हालांकि, मुझे यह उल्लेख करना चाहिए कि यह हमेशा यह कटौती और सूखा नहीं है। कभी-कभी "ऑपरेशन के लिए सबसे अच्छा तरीका क्या है" का जवाब "यह आपके डेटा पर निर्भर करता है"। मेरी सलाह है कि किसी एक पर बसने से पहले अपने डेटा पर अलग-अलग तरीकों का परीक्षण करें।
आगे की पढाई
* पंडों स्ट्रिंग विधियों को इस अर्थ में "सदिश" किया जाता है कि वे श्रृंखला पर निर्दिष्ट हैं लेकिन प्रत्येक तत्व पर काम करते हैं। अंतर्निहित तंत्र अभी भी पुनरावृत्त हैं, क्योंकि स्ट्रिंग ऑपरेशनों को वेक्टर करना मुश्किल है।
मैंने यह उत्तर क्यों लिखा
एक सामान्य प्रवृत्ति जो मैं नए उपयोगकर्ताओं से नोटिस करता हूं, वह है फॉर्म के प्रश्न "मैं अपने एक्स पर एक्स करने के लिए कैसे पुनरावृति कर सकता हूं?" कोड दिखा रहा है जो iterrows()
लूप के लिए कुछ करने के दौरान कॉल करता है । यहाँ क्यों है। लाइब्रेरी के लिए एक नया उपयोगकर्ता जिसे वैश्वीकरण की अवधारणा के लिए पेश नहीं किया गया है, संभवतः उस कोड की कल्पना करेगा जो कुछ करने के लिए अपने डेटा पर पुनरावृत्ति के रूप में उनकी समस्या को हल करता है। एक DataFrame पर पुनरावृति करना नहीं जानते, पहली बात यह है कि वे इसे Google करते हैं और अंत में, इस सवाल पर। फिर वे स्वीकार किए गए उत्तर को यह बताते हुए देखते हैं कि कैसे, और वे अपनी आँखें बंद कर लेते हैं और इस कोड को बिना पहले प्रश्न किए चलाते हैं कि क्या पुनरावृत्ति करना सही बात नहीं है।
इस उत्तर का उद्देश्य नए उपयोगकर्ताओं को यह समझने में मदद करना है कि पुनरावृत्ति जरूरी नहीं कि हर समस्या का समाधान है, और यह बेहतर, तेज और अधिक मुहावरेदार समाधान मौजूद हो सकता है, और यह कि उन्हें तलाशने में निवेश करने लायक समय है। मैं पुनरावृत्ति बनाम वैश्वीकरण का युद्ध शुरू करने की कोशिश नहीं कर रहा हूं, लेकिन मैं चाहता हूं कि नए उपयोगकर्ताओं को इस पुस्तकालय के साथ उनकी समस्याओं के समाधान के बारे में सूचित किया जाए।