ฉันสังเกตเห็นประสิทธิภาพที่แย่มากเมื่อใช้ iterrows จากแพนด้า
นี่คือสิ่งที่เป็นประสบการณ์ของผู้อื่นหรือไม่? มันเฉพาะเจาะจงสำหรับ iterrows และควรหลีกเลี่ยงฟังก์ชั่นนี้สำหรับข้อมูลบางขนาด (ฉันกำลังทำงานกับ 2-3 ล้านแถว)
การสนทนาเกี่ยวกับ GitHub นี้ทำให้ฉันเชื่อว่าเกิดจากการผสม dtypes ใน dataframe แต่ตัวอย่างง่ายๆด้านล่างแสดงให้เห็นว่ามีอยู่แม้จะใช้ 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
เหตุใดการดำเนินการที่เป็นเวกเตอร์จึงใช้งานได้เร็วกว่ามาก ฉันคิดว่าจะต้องมีการทำซ้ำทีละแถวเกิดขึ้นที่นั่นด้วย
ฉันคิดไม่ออกว่าจะไม่ใช้ iterrows ในกรณีของฉันอย่างไร (ฉันจะบันทึกไว้เป็นคำถามในอนาคต) ดังนั้นฉันจะยินดีที่ได้ยินหากคุณสามารถหลีกเลี่ยงการทำซ้ำนี้ได้อย่างสม่ำเสมอ ฉันกำลังคำนวณตามข้อมูลในดาต้าเฟรมแยกกัน ขอบคุณ!
--- แก้ไข: มีการเพิ่มเวอร์ชันที่เรียบง่ายของสิ่งที่ฉันต้องการเรียกใช้ด้านล่าง -
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
อยู่