Python 2.7 熊猫应用功能需要10分钟(numba没有帮助)
我有一个非常简单的函数应用于数据帧的每一行:Python 2.7 熊猫应用功能需要10分钟(numba没有帮助),python-2.7,pandas,Python 2.7,Pandas,我有一个非常简单的函数应用于数据帧的每一行: def distance_ot(fromwp,towp,pl,plee): ` if fromwp[0:3]==towp[0:3]: sxcord=pl.loc[fromwp,"XCORD"] sycord=pl.loc[fromwp,"YCORD"] excord=pl.loc[towp,"XCORD"] eycord=pl.loc[towp,"YCORD"] x=np.abs(excord-sxcord
def distance_ot(fromwp,towp,pl,plee):
` if fromwp[0:3]==towp[0:3]:
sxcord=pl.loc[fromwp,"XCORD"]
sycord=pl.loc[fromwp,"YCORD"]
excord=pl.loc[towp,"XCORD"]
eycord=pl.loc[towp,"YCORD"]
x=np.abs(excord-sxcord); y=np.abs(eycord-sycord)
distance=x+y
return distance
else:
x1=np.abs(plee.loc[fromwp[0:3],"exitx"]-pl.loc[fromwp,"XCORD"])
y1=np.abs(plee.loc[fromwp[0:3],"exity"]-pl.loc[fromwp,"YCORD"])
x2=np.abs(plee.loc[fromwp[0:3],"exitx"]-plee.loc[towp[0:3],"entryx"])
y2=np.abs(plee.loc[fromwp[0:3],"exity"]-plee.loc[towp[0:3],"entryy"])
x3=np.abs(plee.loc[towp[0:3],"entryx"]-pl.loc[towp,"XCORD"])
y3=np.abs(plee.loc[towp[0:3],"entryy"]-pl.loc[towp,"YCORD"])
distance=x1+x2+x3+y1+y2+y3
return distance
这条线被称为:
pot["traveldistance"]=pot.apply(lambda row: distance_ot(fromwp=row["from_wpadr"],towp=row["to_wpadr"],pl=pl,plee=plee),axis=1)
其中:fromwp
和towp
都是字符串,xcord
和ycord
都是浮点数。我尝试过使用numba,但由于某些原因,它并不能提高性能。有什么建议吗
多亏了caiohamamura,解决方案如下:
distance_ot(pl=pl,plee=plee)
pot.ix[pot.from_wpadr.str[0:3]==pot.to_wpadr.str[0:3],"traveldistance"]=pot["distance1"]
pot.ix[pot.from_wpadr.str[0:3]!=pot.to_wpadr.str[0:3],"traveldistance"]=pot["distance2"]
def distance_ot(pl,plee):
from_df = pl.loc[pot["from_wpadr"]]
to_df = pl.loc[pot["to_wpadr"]]
sxcord=from_df["XCORD"].values
sycord=from_df["YCORD"].values
excord=to_df["XCORD"].values
eycord=to_df["YCORD"].values
x=np.abs(excord-sxcord); y=np.abs(eycord-sycord)
pot["distance1"]=x+y
from_df2=plee.loc[pot["from_wpadr"].str[0:3]]
to_df2=plee.loc[pot["to_wpadr"].str[0:3]]
x1=np.abs(from_df2["exitx"].values-from_df["XCORD"].values)
y1=np.abs(from_df2["exity"].values-from_df["YCORD"].values)
x2=np.abs(from_df2["exitx"].values-to_df2["entryx"].values)
y2=np.abs(from_df2["exity"].values-to_df2["entryy"].values)
x3=np.abs(to_df2["entryx"].values-to_df["XCORD"].values)
y3=np.abs(to_df2["entryy"].values-to_df["YCORD"].values)
pot["distance2"]=x1+x2+x3+y1+y2+y3
将
距离\u ot
函数矢量化,一次计算所有距离。我将开始填充a from_df和a to_df,如下所示:
import numpy as np
from_df = pl.loc[np.in1d(pl.loc.index, pot["from_wpadr"])
to_df = pl.loc[np.in1d(pl.loc.index, pot["to_wpadr"])
然后,您可以继续执行您的功能:
sxcord=from_df["XCORD"]
sycord=from_df["YCORD"]
excord=to_df["XCORD"]
eycord=to_df["YCORD"]
x=np.abs(excord-sxcord); y=np.abs(eycord-sycord)
distances=x+y
这将一次计算所有距离。您的if子句也可以矢量化,您的结果将被计算到不同的数组中,那些与if子句匹配的数组和那些不匹配的数组,您只需跟踪布尔数组,以便以后可以将它们放在数据帧中:
first_three_equals = np.char.ljust(pot["from_wpadr"].values.astype(str), 3) \
== np.char.ljust(pot["to_wpadr"].values.astype(str), 3)
将
距离\u ot
函数矢量化,一次计算所有距离。我将开始填充a from_df和a to_df,如下所示:
import numpy as np
from_df = pl.loc[np.in1d(pl.loc.index, pot["from_wpadr"])
to_df = pl.loc[np.in1d(pl.loc.index, pot["to_wpadr"])
然后,您可以继续执行您的功能:
sxcord=from_df["XCORD"]
sycord=from_df["YCORD"]
excord=to_df["XCORD"]
eycord=to_df["YCORD"]
x=np.abs(excord-sxcord); y=np.abs(eycord-sycord)
distances=x+y
这将一次计算所有距离。您的if子句也可以矢量化,您的结果将被计算到不同的数组中,那些与if子句匹配的数组和那些不匹配的数组,您只需跟踪布尔数组,以便以后可以将它们放在数据帧中:
first_three_equals = np.char.ljust(pot["from_wpadr"].values.astype(str), 3) \
== np.char.ljust(pot["to_wpadr"].values.astype(str), 3)
嗯…您有多少行1…1000…10000000000?Apply几乎像for循环,所以速度会很慢。您必须对函数进行矢量化,以便它能够一次计算所有距离,从WP和
towp
阵列接收整个数据,然后将结果分配给pot[“traveldistance”]
。要获得更详细的解决方案,您必须解释函数,pl
和plee
dataframes。您应该尝试自己对函数进行矢量化,如果有任何问题,请发布另一个问题。解决方案是:矢量化,一次计算所有距离(当然没有循环)。谢谢Caiomamura!你的想法很有用,我修改了代码。我用正确的行更新了问题,节省了500秒!嗯…您有多少行1…1000…10000000000?Apply几乎像for循环,所以速度会很慢。您必须对函数进行矢量化,以便它能够一次计算所有距离,从WP
和towp
阵列接收整个数据,然后将结果分配给pot[“traveldistance”]
。要获得更详细的解决方案,您必须解释函数,pl
和plee
dataframes。您应该尝试自己对函数进行矢量化,如果有任何问题,请发布另一个问题。解决方案是:矢量化,一次计算所有距离(当然没有循环)。谢谢Caiomamura!你的想法很有用,我修改了代码。我用正确的行更新了问题,节省了500秒!