2016-04-13 7 views
6

अगर मैं एक समारोहभागो समारोह ठीक एक बार एक पांडा dataframe

def do_irreversible_thing(a, b): 
    print a, b 

और एक dataframe है, का कहना है कि में प्रत्येक पंक्ति के लिए

df = pd.DataFrame([(0, 1), (2, 3), (4, 5)], columns=['a', 'b']) 

वास्तव में क्या एक बार समारोह चलाने के लिए सबसे अच्छा तरीका है एक पांडा डेटाफ्रेम में प्रत्येक पंक्ति के लिए। As अन्य questions में इंगित किया गया है, df.apply पांडा जैसे कुछ पहले पंक्ति के लिए फ़ंक्शन को दो बार कॉल करेंगे। यहां तक ​​कि

np.vectorize(do_irreversible_thing)(df.a, df.b) 

numpy का उपयोग कर समारोह पहली पंक्ति पर दो बार के नाम से जाना, होगा के रूप में df.T.apply() या df.apply (..., अक्ष = 1) का कारण बनता है।

क्या इस स्पष्ट लूप की तुलना में प्रत्येक पंक्ति के साथ फ़ंक्शन को कॉल करने का कोई तेज़ या क्लीनर तरीका है?

for idx, a, b in df.itertuples(): 
     do_irreversible_thing(a, b) 
+3

है जैसे कि यह apply सकता विल नहीं 'df.apply (लैम्ब्डा एक्स: do_irreversible_thing (एक्स [ 'एक'] , एक्स ['बी']), अक्ष = 1) 'काम? विचार के अलावा अपने फ़ंक्शन में वेक्टरिज्ड विधियों का उपयोग करना है, इसलिए यह ब्याज के पूरे कॉलम पर काम करता है – EdChum

+0

यह 'for' लूप के लिए नौकरी की तरह लगता है। आमतौर पर दुष्प्रभावों को सदिश बनाने का एक अच्छा तरीका नहीं है। – user2357112

+0

यदि साइड इफेक्ट्स प्रत्येक पंक्ति के लिए ऑपरेशन पर निर्भर नहीं हैं तो यह vectorizable – EdChum

उत्तर

2

यह स्पष्ट नहीं है अपने कार्य क्या कर रहा है, लेकिन apply प्रत्येक पंक्ति के एक समारोह आप अपने समारोह पंक्ति-वार apply और ब्याज की स्तंभ तत्वों पारित करने के लिए axis=1 पास करके ऐसा कर सकते हैं:

In [155]: 
def foo(a,b): 
    return a*b 
​ 
df = pd.DataFrame([(0, 1), (2, 3), (4, 5)], columns=['a', 'b']) 
df.apply(lambda x: foo(x['a'], x['b']), axis=1) 

Out[155]: 
0  0 
1  6 
2 20 
dtype: int64 

In [156]: 
df['a'] * df['b'] 

Out[156]: 
0  0 
1  6 
2 20 
dtype: int64 
:

हालांकि, इतने लंबे समय के अपने कार्य df प्रत्येक पंक्ति पर परिवर्तनशील पर निर्भर नहीं करता के रूप में है, तो आप सिर्फ एक vectorised विधि संपूर्ण स्तंभ पर संचालित करने के लिए उपयोग कर सकते हैं

कारण जबकि apply अपने df पर पुनरावृत्ति के लिए बस वाक्यात्मक चीनी है कि इसकी वजह कार्यों तो vectorised कर रहे हैं यह बेहतर स्केल करेगा तो यह एक for पाश अनिवार्य रूप से

2

तरह से मैं यह कर (क्योंकि मैं भी नहीं है df.itertuples साथ पाशन के विचार) की तरह है:

df.apply(do_irreversible_thing, axis=1) 

और फिर अपने समारोह की तरह होना चाहिए:

def do_irreversible_thing(x): 
    print x.a, x.b 

इस तरह से आप प्रत्येक पंक्ति पर अपने समारोह को चलाने के लिए सक्षम होना चाहिए।

या

अगर आप अपने समारोह संशोधित नहीं कर सकते तो आप इस

df.apply(lambda x: do_irreversible_thing(x[0],x[1]), axis=1) 
संबंधित मुद्दे