Python:如何正确使用apply()?

2024-09-30 10:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含点的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)

对于每一点,我想应用这个函数:

^{pr2}$

我要做的是:

for i in df.index:
    val = returnValuePoints(df, data, i)

如何避免循环,并将此函数应用于具有apply()的所有行


Tags: 数据函数indffordataindexval
3条回答

我给你举个例子。在

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)) 

Here is the output

关于以下代码的警告:我还没有实际测试过它,因为我无法访问geopandas环境。不过,我想应该行得通。在

我不认为你真的想在这里用申请表。使用geopandas方法,可以通过应用一些仿射变换来获得geopandas GeoSeries点: 首先,translate通过xOrigin, yOrigin得到一系列点:

translated = df['geometry'].translate(xoff=-1*xOrigin, yoff=-1*yOrigin)

然后,你可以用pixelWidth, pixelHeightscale对x轴进行反射和缩放:

^{pr2}$

这里乘以-1就是反射。如果您想做(point[1] - yOrigin),那么可以用1替换-1。在

这将给您一个GeoSeries。如果你想要一系列的整数点对,你需要做更多的工作。下面的代码将为您提供两个带有x和y值的整数Series(geopandas version>;0.3.0必需):

^{3}$

然后,你可以,比方说,把它们放在原始数据框中:

df['x_val'] = x_val
df['y_val'] = y_val

如果你真的想要一个元组列表(我想你不应该!你失去了熊猫的所有优势!)您可以:

list(df[['x_val', 'y_val']].itertuples(index=False, name=None))

首先,您需要重新构造方法,使其获得可以在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对dataframe调用apply,以便能够访问每行的列值:

^{pr2}$

相关问题 更多 >

    热门问题