最佳答案
我注意到在使用来自大熊猫的迭代时,性能非常差。
它是特定于迭代行的吗? 对于特定大小的数据(我使用的是2-3百万行) ,是否应该避免使用这个函数?
GitHub 上的这个讨论 让我相信它是在数据框架中混合 dtype 时引起的,然而下面的简单示例显示,即使使用一个 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]