我有一个这样的数据框:
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)
至于性能方面的问题,这里有一些技巧可以帮助您。
numba
的JIT编译和你的函数的自动向量化。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句