2015-10-19 7 views
7

पर एकाधिक तर्क कैसे पारित करें मेरे पास गिनती नामक एक विधि है जिसमें 2 तर्क होते हैं। मुझे आवेदन() विधि का उपयोग करके इस विधि को कॉल करने की आवश्यकता है। लेकिन जब मैं लागू विधि के लिए दो पैरामीटर गुजर रहा यह निम्न त्रुटि दे रहा है:लागू फ़ंक्शन

TypeError: counting() takes exactly 2 arguments (1 given)

मैं निम्नलिखित धागा python pandas: apply a function with arguments to a series. Update देखा है और मैं functool.partial उपयोग करने के लिए के रूप में मैं आयात करने के लिए नहीं करना चाहते हैं नहीं करना चाहती पैरामीटर पारित करने में सक्षम होने के लिए अतिरिक्त कक्षाएं।

def counting(dic, strWord): 
    if strWord in dic: 
     return dic[strWord] 
    else: 
     return 0 

DF['new_column'] = DF['dic_column'].apply(counting, 'word') 

अगर मैं एक एकल पैरामीटर देते हैं, यह काम करता है:

DF['new_column'] = DF['dic_column'].apply(lambda dic: counting(dic, 'word')) 

दूसरी ओर, वहाँ बिल्कुल partial उपयोग करने के साथ कुछ भी गलत नहीं:

def awesome_count(dic): 
    if strWord in dic: 
     return dic[strWord] 
    else: 
     return 0 

DF['new_column'] = DF['dic_column'].apply(counting) 
+0

'dic' क्या है और आप कहां से आने की उम्मीद करते हैं? इसके अलावा, 'आंशिक' के साथ आपकी समस्या क्या है? यह मानक पुस्तकालय का हिस्सा है ... – tzaman

+0

आप कहां से दूसरे तर्क से आना चाहते थे? –

+0

अधिक स्पष्टता के लिए प्रश्न संशोधित किया गया। डिक कॉलम मान है जो डिफ़ॉल्ट रूप से लागू फ़ंक्शन के माध्यम से आ जाएगा। दूसरा तर्क एक नया तर्क है जिसे तर्क का उपयोग करके पारित किया जा रहा है। – Bonson

उत्तर

12

तुम सिर्फ एक lambda इस्तेमाल कर सकते हैं यहां:

from functools import partial 
count_word = partial(counting, strWord='word') 
DF['new_column'] = DF['dic_column'].apply(count_word) 

@EdChum का उल्लेख है, यदि आपके counting विधि वास्तव में सिर्फ एक शब्द को देख या शून्य करने के लिए यह चूक है, तो आप सिर्फ काम dict.get बजाय अपने आप को एक लिखने की विधि का उपयोग कर सकते हैं:

DF['new_column'] = DF['dic_column'].apply(lambda dic: dic.get('word', 0)) 

गैर lambda और जिस तरह से, ऊपर करने के लिए operator मॉड्यूल के माध्यम से:

from operator import methodcaller 
count_word = methodcaller(get, 'word', 0) 
DF['new_column'] = DF['dic_column'].apply(count_word) 
+1

यह मुझे आवश्यक समाधान देता है। धन्यवाद। आपके पहले के प्रश्न के लिए, मैंने माना था कि यह विधि आंशिक उपयोग करने से बेहतर होगी। क्या यह सही है? साथ ही, यदि संभव हो, तो इस समाधान की मेरी समझ की पुष्टि करें कि यहां कॉलम का मान वैरिएबल डिक को पास किया गया है जिसे बाद में किसी अन्य चर मूल्य के साथ गिनती विधि में पास किया जाता है। – Bonson

+1

'आंशिक' बराबर है, लैम्ब्डा किसी भी तरह से 'बेहतर' नहीं है: उदा। 'countWord = आंशिक (गिनती, strWord = 'शब्द') 'और फिर' लागू करें (countWord)'। और हाँ, आपकी समझ सही है। – tzaman

+0

मुझे लगता है कि इस मामले में आप केवल 'डीएफ [' new_column '] = डीएफ [' dic_column '] कर सकते हैं। लागू करें (lambda x: dic.get (x, 0)) ' – EdChum

3

स्वीकार किए जाते हैं जवाब पूरी तरह से एकदम सही है। मुझे पायथन के बारे में कुछ दिलचस्प बातें सिखाईं। लेकिन बस मज़ेदार के लिए, हम यहां और अधिक सटीक हैं जो हम खोज रहे हैं:

selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate'] 
for this_word in selected_words: 
    products[this_word] = products['word_count'].apply(lambda dic: dic.get(this_word, 0)) 

प्रश्न पोस्ट करने के लिए धन्यवाद!

+0

यह वही है जो मैं ढूंढ रहा था। धन्यवाद –

+0

मैं जानना चाहता हूं कि यह क्यों काम करता है ¿सिर्फ स्कोपिंग का मामला है? –

संबंधित मुद्दे