我有两个dataframes,功能花费很长的时间在Python运行 - 效率
df1 = pd.DataFrame({'a': [1.5, 2.5], 'b': [0.25, 2.75], 'c': [1.25, 0.75], 'd': [1.5, 2.5],'e': [0.25, 2.75], 'f': [1.25, 0.75]})
df2 = pd.DataFrame({'a': [1.5, 2.5,3.5,4.5], 'b': [0.25, 1.5, 2.5, 2.75], 'c': [1.25, 0.75, 3.5, 4.5], 'd': [1.5, 2.5, 3.5, 4.5],'e': [0.25, 2.75, 1.5, 3.5], 'f': [1.25, 0.75, 2.5, 4.5]})
对于DF1每一行,我要找到该行的距离,DF2的所有行的具体列。找到距离后,我想找到所有单行中的最小距离,并返回df2对应的'e'值。
例如,如果我传递a和b列,对于df1的每一行,我想要找到a和b之间的所有df2行的距离,并找到所有行的最小距离并获得相应的'e' df2的值。
我使用以下两种功能,
def distance(x1, x2, L):
start_time = time.time()
dist = (np.sum((np.array(x1)-np.array(x2))**L))**(1/(float(L)))
print("Time taken: " + str(round(time.time() - start_time,2)) + " seconds")
return dist
def mindistance(data1,data2,variables,L):
start_time = time.time()
pred_values=[]
test1=[]
for index2, row2 in data2.iterrows():
test=[]
for index1, row1 in data1.iterrows():
a=distance(row2[variables],row1[variables],L)
test.append(a)
#print(test)
index=test.index(min(test))
#print(index)
b=round(data1['e'].iloc[index],2)
pred_values.append(b)
print(pred_values)
print(len(pred_values))
return "Time taken: " + str(round(time.time() - start_time,2)) + " seconds"
print mindistance(df2, df1,['a','b'],2)
此功能工作正常。但是这个代码存在一个巨大的效率问题。距离部分需要很长时间。假设如果基于我的原始数据框大约有60000次迭代需要完成,则计算它需要一分多钟。我已经尝试了逐行调试,大部分时间都在a=distance(row2[variables],row1[variables],L)
行中。任何人都可以帮助我提高代码的效率吗?
你分析了你的代码吗?如果使用'apply'而不是显式迭代数据框会发生什么? –
@PaulH我很抱歉,我是python的新手。不知道什么是分析,不知道如何使用应用函数?你能帮我做这件事吗? – haimen
分析python代码:http://stackoverflow.com/questions/3927628/how-can-i-profile-python-code-line-by-line –