अजगर पांडा: एक श्रृंखला के तर्कों के साथ एक फ़ंक्शन लागू करें


147

मैं अजगर पंडों में एक श्रृंखला के तर्कों के साथ एक समारोह लागू करना चाहता हूं:

x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...

प्रलेखन एक तरीका लागू करने के लिए समर्थन का वर्णन करता है, लेकिन यह किसी भी तर्क को स्वीकार नहीं करता। क्या कोई भिन्न पद्धति है जो तर्कों को स्वीकार करती है? वैकल्पिक रूप से, क्या मुझे एक साधारण वर्कअराउंड याद आ रहा है?

अद्यतन (अक्टूबर 2017): ध्यान दें कि चूंकि यह प्रश्न मूल रूप से पूछा गया था कि पांडाल apply()को स्थिति और कीवर्ड के तर्कों को संभालने के लिए अपडेट किया गया है और अब ऊपर दिए गए दस्तावेज़ीकरण लिंक इसे दर्शाता है और दिखाता है कि दोनों प्रकार के तर्क को कैसे शामिल किया जाए।


3
क्यों नहीं बस का उपयोग करें functools.partial, या starmap?
जोएल कॉर्नेट

जवाबों:


170

पांडा के नए संस्करण कर आप अतिरिक्त तर्क (देखें से गुजरने की अनुमति नई प्रलेखन )। तो अब आप कर सकते हैं:

my_series.apply(your_function, args=(2,3,4), extra_kw=1)

श्रृंखला के तत्व के बाद स्थितीय तर्क जोड़े जाते हैं ।


पांडा के पुराने संस्करण के लिए:

प्रलेखन यह स्पष्ट रूप से बताता है। लागू पद्धति एक अजगर फ़ंक्शन को स्वीकार करती है जिसमें एक एकल पैरामीटर होना चाहिए। यदि आप अधिक मापदंडों को पारित करना चाहते हैं, तो आपको functools.partialजोएल कॉर्नेट द्वारा सुझाई गई अपनी टिप्पणी में उपयोग करना चाहिए ।

एक उदाहरण:

>>> import functools
>>> import operator
>>> add_3 = functools.partial(operator.add,3)
>>> add_3(2)
5
>>> add_3(7)
10

आप कीवर्ड तर्कों का उपयोग करके भी पास कर सकते हैं partial

लैम्बडा बनाने का एक और तरीका होगा:

my_series.apply((lambda x: your_func(a,b,c,d,...,x)))

लेकिन मुझे लगता है कि इसका इस्तेमाल partialकरना बेहतर है।


12
DataFrame लागू करने के लिए विधि argsतर्क स्वीकार करती है, जो कि नामांकित लोगों के लिए अतिरिक्त स्थितीय तर्क या ** kwds धारण करने वाला टपल है। मैंने Series.apply () github.com/pydata/pandas/issues/1829
Wouter Overmeire

28
फ़ीचर लागू किया गया है, आगामी पांडा रिलीज़ में होगा
वेस मैककिनी

4
यह एक अच्छा जवाब है, लेकिन पहले 2/3 अब वास्तव में अप्रचलित है। IMO, यह उत्तर केवल नए दस्तावेज़ के लिंक के साथ अच्छी तरह से अपडेट किया जा सकता है और स्थिति और / या कीवर्ड आर्ग के साथ उपयोग करने का एक संक्षिप्त उदाहरण है। बस FWIW और मूल उत्तर की आलोचना नहीं, बस एक अपडेट IMO से लाभ होगा, खासकर क्योंकि यह अक्सर पढ़ा जाने वाला उत्तर होता है।
जॉनई

@watsonic के बाद से प्रलेखन अद्यतन किया गया है और पुराने लिंक पर क्लिक करने से वर्तमान दस्तावेज़ीकरण हो जाता है जो अब बहुत अच्छी तरह से प्रश्न का उत्तर देता है।
जॉन

नोट: यदि आप उदाहरण के लिए एकल स्ट्रिंग तर्क पारित कर रहे हैं 'abc', तो args=('abc')तीन तर्कों के रूप में मूल्यांकन किया जाएगा ('a', 'b', 'c')। इससे बचने के लिए, आपको एक ट्यूपल पास करना होगा जिसमें स्ट्रिंग हो, और ऐसा करने के लिए, एक अनुगामी अल्पविराम शामिल करें:args=('abc',)
रॉकी के

82

कदम:

  1. एक डेटाफ़्रेम बनाएँ
  2. एक फंक्शन बनाएं
  3. लागू विवरण में फ़ंक्शन के नामित तर्कों का उपयोग करें।

उदाहरण

x=pd.DataFrame([1,2,3,4])  

def add(i1, i2):  
    return i1+i2

x.apply(add,i2=9)

इस उदाहरण का परिणाम यह है कि डेटाफ्रेम में प्रत्येक संख्या को 9 नंबर में जोड़ा जाएगा।

    0
0  10
1  11
2  12
3  13

स्पष्टीकरण:

"ऐड" फ़ंक्शन के दो पैरामीटर हैं: i1, i2। पहला पैरामीटर डेटा फ्रेम में मूल्य होने जा रहा है और दूसरा वह है जो हम "लागू" फ़ंक्शन के लिए पास करते हैं। इस स्थिति में, हम कीवर्ड तर्क "i2" का उपयोग करके "9" पास कर रहे हैं।


2
ठीक वही जो मेरे द्वारा खोजा जा रहा था। विशेष रूप से, इसके लिए केवल एक श्रृंखला (या डीएफ) को संभालने के लिए एक कस्टम फ़ंक्शन बनाने की आवश्यकता नहीं है। उत्तम!
कॉनर

एकमात्र शेष प्रश्न यह है: ऐड (i1) में पहले arg में एक कीवर्ड तर्क कैसे पास करें और i2 के साथ पुनरावृति करें?
कॉनर

मुझे लगता है कि यह सबसे अच्छा जवाब है
क्रैडपिक

43
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))

11
धन्यवाद! क्या आप बता सकते हैं कि arg = (arg1) को पहले तर्क के बाद अल्पविराम की आवश्यकता क्यों है?
DrMisha

21
@ मीशाटेप्लेट्सकी, आपको कोष्ठक की सामग्री को लम्बाई का
टापू

3
के लिए आर्ग में डालने के बारे में क्या func। इसलिए अगर मैं आवेदन करना चाहता हूं तो मुझे pd.Series.mean(axis=1)कैसे करना है axis=1?
लिटिल बॉबी टेबल्स

1
एक साइड नोट के रूप में, आप <args> पैरामीटर (जैसे: x = my_series.apply (my_function, keyword_arg = arg1) का उपयोग किए बिना एक कीवर्ड तर्क जोड़ सकते हैं, जहां <keyword_arg> my_function के इनपुट मापदंडों में से हैं)
lev

1
यह प्रतिक्रिया बहुत कम है और कुछ भी नहीं समझाती है
FistOfFury

23

आप फ़ंक्शन को किसी भी प्रकार के तर्क दे सकते हैं, जो applyया तो अनाम तर्कों के माध्यम से कॉल कर रहा है, argsपैरामीटर के लिए एक टपल के रूप में पारित किया गया है, या अन्य कीवर्ड तर्कों के माध्यम से आंतरिक रूप से kwdsपैरामीटर द्वारा डिक्शनरी के रूप में कैप्चर किया गया है।

उदाहरण के लिए, चलिए एक फ़ंक्शन बनाते हैं जो 3 और 6 के बीच के मानों के लिए True लौटाता है, और अन्यथा गलत।

s = pd.Series(np.random.randint(0,10, 10))
s

0    5
1    3
2    1
3    1
4    6
5    0
6    3
7    4
8    9
9    6
dtype: int64

s.apply(lambda x: x >= 3 and x <= 6)

0     True
1     True
2    False
3    False
4     True
5    False
6     True
7     True
8    False
9     True
dtype: bool

यह अनाम फ़ंक्शन बहुत लचीला नहीं है। आइए अपनी श्रृंखला में उस न्यूनतम और अधिकतम मान को नियंत्रित करने के लिए दो तर्कों के साथ एक सामान्य फ़ंक्शन बनाएं।

def between(x, low, high):
    return x >= low and x =< high

हम अनाम फ़ंक्शन पास करके पहले फ़ंक्शन के आउटपुट को दोहरा सकते हैं args:

s.apply(between, args=(3,6))

या हम नामित तर्कों का उपयोग कर सकते हैं

s.apply(between, low=3, high=6)

या यहां तक ​​कि दोनों का एक संयोजन

s.apply(between, args=(3,), high=6)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.