熊猫Dataframe列做算法

用户名

我有一个这样的数据框:

df = pd.DataFrame({
    'A': ['a', 'a', 'a', 'a', 'a'],
    'lon1': [128.0, 135.0, 125.0, 123.0, 136.0],
    'lon2': [128.0, 135.0, 139.0, 142.0, 121.0],
    'lat1': [38.0, 32.0, 38.0, 38.0, 38.0],
    'lat2': [31.0, 32.0, 35.0, 38.0, 29.0],
    'angle': [0, 0, 0, 0, 0]
})

我想通过此功能计算每行的角度并保存回角度列

def angle(lon1,lat1,lon2,lat2):
    dx = lon2 - lon1
    dy = lat2 - lat1
    direction = 0;
    if ((dx == 0) & (dy == 0)):  # same position
    return direction
    if (dx > 0.0) :    
        direction = 90-np.arctan2(dy,dx)*180/np.pi
    elif (dy > 0.0 ) :    
        direction = 180+(270-(np.arctan2(dy,dx)*180/np.pi))
    else :   
        direction = 360-(270+(np.arctan2(dy,dx)*180/np.pi))
        if (direction < 0) :
            direction += 360

    return (direction.astype(int) % 360)  

我试过了

df.ix[df['A'].notnull(), 'angle'] =angle(
    df[df['A'].notnull()]['lon1'],
    df[df['A'].notnull()]['lat1'],
    df[df['A'].notnull()]['lon2'], 
    df[df['A'].notnull()]['lat2']) 

我有一个错误

ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

我尝试for index,row in df.iterrows():了for循环的结果是可以的,但是花了很长时间(原始数据大约是一千万行)

谁能给我一些有效的方法?

海龟

似乎您正在尝试将功能angle(...)应用于数据框的每一行。

首先,必须将所有字符串类型的数字强制转换为float以便进行计算。

df1.loc[:, "lon1"] = df1.loc[:, "lon1"].astype("float")
df1.loc[:, "lon2"] = df1.loc[:, "lon2"].astype("float")
df1.loc[:, "lat1"] = df1.loc[:, "lat2"].astype("float")
df1.loc[:, "lat2"] = df1.loc[:, "lat2"].astype("float")

妳去

df1.loc[:, "angle"] = df1.apply(lambda x: angle(x["lon1"], x["lat1"], x["lon2"], x["lat2"]), axis = 1)

至于性能方面的问题,这里有一些技巧可以帮助您。

  1. 分析。
  2. 使用numba的JIT编译和你的函数的自动向量化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章