我有一个包含点的geopandas数据框架
df:
geometry
0 POINT (806470.3646198167 2064879.919354021)
1 POINT (792603.391127742 2170760.8355139)
2 POINT (787263.3037740411 2050925.953643546)
3 POINT (809203.6762813283 2160874.194588484)
4 POINT (781668.2687635225 2051524.634389534)
对于每个点,我都想应用这个函数:
def returnValuePoints(df, i):
points_list = [ (df['geometry'][i].x, df['geometry'][i].y) ] #list of X,Y coordinates
for point in points_list:
col = int((point[0] - xOrigin) / pixelWidth)
row = int((yOrigin - point[1] ) / pixelHeight)
return (row, col)
这就是我要做的:
for i in df.index:
val = returnValuePoints(df, data, i)
如何避免循环并使用apply()
将此函数应用于所有行
发布于 2019-06-13 21:41:41
首先,您需要重新构造您的方法,以便它接受可以使用apply中的lambda函数传递的值(考虑您希望如何对单个行的值进行操作):
def returnValuePoints(x, y):
point = (x, y)
col = int((point[0] - xOrigin) / pixelWidth)
row = int((yOrigin - point[1] ) / pixelHeight)
return (row, col)
其次,您可以使用axis=1在数据帧上调用apply,以便能够访问每行的列值:
val = df.apply(lambda x: returnValuePoints(x.geometry.x, x.geometry.y), axis=1)
发布于 2019-06-14 21:27:57
我将向您展示一个示例。
import pandas as pd
# reading csv
s = pd.read_csv("stock.csv", squeeze = True)
# defining function to check price
def fun(num):
if num<200:
return "Low"
elif num>= 200 and num<400:
return "Normal"
else:
return "High"
# passing function to apply and storing returned series in new
new = s.apply(fun)
# printing first 3 element
print(new.head(3))
# printing elements somewhere near the middle of series
print(new[1400], new[1500], new[1600])
# printing last 3 elements
print(new.tail(3))
https://stackoverflow.com/questions/56581654
复制相似问题