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秒!