2017-04-18 16 views
8

मैं प्रति समूह प्रत्येक पंक्ति में फ़ंक्शन लागू करने के लिए apply() के साथ संयोजन में df.groupby() का उपयोग करना चाहता हूं।तर्कों के साथ पांडस ग्रुपबी() + लागू() का उपयोग करें

मैं सामान्य रूप से (, ध्यान दें कि यह groupby() के बिना है) निम्नलिखित कोड है, जो आमतौर काम करता है का उपयोग करें:

df.apply(myFunction, args=(arg1,)) 

groupby() के साथ मैंने कोशिश की है:

df.groupby('columnName').apply(myFunction, args=(arg1,)) 

हालांकि, मैं मिलता है निम्न त्रुटि:

TypeError: myFunction() got an unexpected keyword argument 'args'

इसलिए, मेरा प्रश्न है: मैं groupby() और apply() का उपयोग ऐसे फ़ंक्शन के साथ कैसे कर सकता हूं जिसके लिए तर्क की आवश्यकता है?

+2

यह 'df.groupby ('columnName') के साथ काम करेगा लागू (myfunction, ('ARG1'))' – Zero

+0

इस @Zero महान उत्तर के रूप में बहुत समान है है ओपी के प्रयास किए गए समाधान के लिए और लैम्ब्डा की आवश्यकता नहीं है। मेरा सुझाव है कि आप इसे एक उत्तर के रूप में पोस्ट करें। – DontDivideByZero

+0

@ ज़ीरो, मेरे पास ओपी के समान ही quetion है, लेकिन यह मेरे लिए काम नहीं करता है - मुझे अभी भी ओपी के समान त्रुटि मिलती है। साथ ही, क्या मैं पूछ सकता हूं कि आपकी टिप्पणी क्यों काम करनी चाहिए और ओपी का दृष्टिकोण (जो मेरा जैसा ही है) क्यों नहीं?मुझे यह कहीं भी दस्तावेज नहीं मिला है –

उत्तर

8

pandas.core.groupby.GroupBy.apply पैरामीटर args नामित नहीं है, लेकिन pandas.DataFrame.apply यह होता है।

तो यह प्रयास करें:

df.groupby('columnName').apply(lambda x: myFunction(x, arg1)) 

या के रूप में @Zero ने सुझाव दिया:

df.groupby('columnName').apply(myFunction, ('arg1')) 

डेमो:

In [82]: df = pd.DataFrame(np.random.randint(5,size=(5,3)), columns=list('abc')) 

In [83]: df 
Out[83]: 
    a b c 
0 0 3 1 
1 0 3 4 
2 3 0 4 
3 4 2 3 
4 3 4 1 

In [84]: def f(ser, n): 
    ...:  return ser.max() * n 
    ...: 

In [85]: df.apply(f, args=(10,)) 
Out[85]: 
a 40 
b 40 
c 40 
dtype: int64 

जब GroupBy.apply का उपयोग कर आप या तो एक नामित तर्क पारित कर सकते हैं:

In [86]: df.groupby('a').apply(f, n=10) 
Out[86]: 
    a b c 
a 
0 0 30 40 
3 30 40 40 
4 40 20 30 

तर्कों की किसी टपल:

In [87]: df.groupby('a').apply(f, (10)) 
Out[87]: 
    a b c 
a 
0 0 30 40 
3 30 40 40 
4 40 20 30 
+0

एक आकर्षण की तरह काम करता है। धन्यवाद। – beta

+1

क्या आप सुनिश्चित हैं कि यहां एक 'तर्क' पैरामीटर को टुपल में पास करने का कोई तरीका नहीं है? मैंने देखा है कि 'कहीं और' पर इस्तेमाल किया गया है और यह लैम्ब्डा अभिव्यक्ति की आवश्यकता को रोकता है –

+1

@BradSolomon प्रश्न टिप्पणियों में शून्य का जवाब देखें – DontDivideByZero

2

क्यों एक args पैरामीटर का उपयोग कर एक त्रुटि तथ्य pandas.DataFrame.apply करता है कि एक args पैरामीटर (एक टपल) है से स्टेम सकता है फेंकता से अधिक कुछ भ्रम की स्थिति यहाँ है, जबकि pandas.core.groupby.GroupBy.apply नहीं है ।

तो, जब आप डेटाफ्रेम पर .apply पर कॉल करते हैं, तो आप इस तर्क का उपयोग कर सकते हैं; जब आप किसी समूहby ऑब्जेक्ट पर .apply पर कॉल करते हैं, तो आप नहीं कर सकते।

@ मैक्सयू के उत्तर में, अभिव्यक्ति lambda x: myFunction(x, arg1)func (पहला पैरामीटर) तक पारित किया गया है; अतिरिक्त *args/**kwargs निर्दिष्ट करने की कोई आवश्यकता नहीं है क्योंकि arg1 लैम्ब्डा में निर्दिष्ट है।

एक उदाहरण:।

import numpy as np 
import pandas as pd 

# Called on DataFrame - `args` is a 1-tuple 
# `0`/`1` are just the axis arguments to np.sum 
df.apply(np.sum, axis=0) # equiv to df.sum(0) 
df.apply(np.sum, axis=1) # equiv to df.sum(1) 


# Called on groupby object of the DataFrame - will throw TypeError 
print(df.groupby('col1').apply(np.sum, args=(0,))) 
# TypeError: sum() got an unexpected keyword argument 'args' 
संबंधित मुद्दे