पंडों से पुनरावृत्तियों का उपयोग करते समय मैंने बहुत खराब प्रदर्शन देखा है।
क्या यह कुछ ऐसा है जो दूसरों द्वारा अनुभव किया जाता है? क्या यह पुनरावृत्तियों के लिए विशिष्ट है और क्या इस फ़ंक्शन को एक निश्चित आकार के डेटा से बचा जाना चाहिए (मैं 2-3 मिलियन पंक्तियों के साथ काम कर रहा हूं)?
GitHub पर इस चर्चा ने मुझे विश्वास दिलाया कि यह डेटाफ़्रेम में dtypes को मिलाते समय होता है, हालाँकि नीचे दिए गए सरल उदाहरण से पता चलता है कि यह एक dtype (float64) का उपयोग करते समय भी होता है। मेरी मशीन पर 36 सेकंड लगते हैं:
import pandas as pd
import numpy as np
import time
s1 = np.random.randn(2000000)
s2 = np.random.randn(2000000)
dfa = pd.DataFrame({'s1': s1, 's2': s2})
start = time.time()
i=0
for rowindex, row in dfa.iterrows():
i+=1
end = time.time()
print end - start
क्यों वेक्टराइज्ड ऑपरेशंस इतनी जल्दी लागू होते हैं? मुझे लगता है कि वहाँ भी कुछ पंक्ति पंक्ति द्वारा चलना चाहिए।
मैं यह पता नहीं लगा सकता कि मेरे मामले में पुनरावृत्तियों का उपयोग कैसे न करें (यह मैं भविष्य के प्रश्न के लिए बचाऊंगा)। इसलिए मैं सुनवाई की सराहना करता हूं यदि आप लगातार इस चलना से बचने में सक्षम हैं। मैं अलग-अलग डेटाफ़्रेम में डेटा के आधार पर गणना कर रहा हूं। धन्यवाद!
--- संपादित करें: जो मैं चलाना चाहता हूं उसका सरलीकृत संस्करण नीचे जोड़ा गया है ---
import pandas as pd
import numpy as np
#%% Create the original tables
t1 = {'letter':['a','b'],
'number1':[50,-10]}
t2 = {'letter':['a','a','b','b'],
'number2':[0.2,0.5,0.1,0.4]}
table1 = pd.DataFrame(t1)
table2 = pd.DataFrame(t2)
#%% Create the body of the new table
table3 = pd.DataFrame(np.nan, columns=['letter','number2'], index=[0])
#%% Iterate through filtering relevant data, optimizing, returning info
for row_index, row in table1.iterrows():
t2info = table2[table2.letter == row['letter']].reset_index()
table3.ix[row_index,] = optimize(t2info,row['number1'])
#%% Define optimization
def optimize(t2info, t1info):
calculation = []
for index, r in t2info.iterrows():
calculation.append(r['number2']*t1info)
maxrow = calculation.index(max(calculation))
return t2info.ix[maxrow]
apply
सदिश नहीं है।iterrows
यह और भी बुरा है क्योंकि यह सब कुछ बॉक्स (कि 'के साथ पूर्ण अंतरapply
)। आपको केवलiterrows
बहुत ही कम स्थितियों में उपयोग करना चाहिए । IMHO कभी नहीं। दिखाएँ कि आप वास्तव में क्या कर रहे हैंiterrows
।