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

Python:如何正确使用apply()?,python,pandas,apply,geopandas,Python,Pandas,Apply,Geopandas,我有一个包含点的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)

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

将此函数应用于所有行?首先,您需要重新构造您的方法,以便它接受您可以在apply中使用lambda函数传递的值(想想您希望如何对单个行的值进行操作):

其次,您可以使用axis=1在数据帧上调用apply,以便能够访问每行的列值:

val = df.apply(lambda x: returnValuePoints(x.geometry.x, x.geometry.y), axis=1)

关于下面代码的警告:我没有实际测试它,因为我没有访问geopandas环境的权限。然而,我认为它应该起作用

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

translated = df['geometry'].translate(xoff=-1*xOrigin, yoff=-1*yOrigin)
然后,您可以使用
比例
对x轴进行反射,并按
像素宽度、像素高度进行缩放:

scaled_translated = translated.scale(xfact=1/pixelWidth, yfact=-1/pixelHeight)
这里乘以-1进行反射。如果您打算执行
(点[1]-yOrigin)
,则可以将-1替换为1

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

然后,您可以将它们放在原始数据框中:

df['x_val'] = x_val
df['y_val'] = y_val
如果你真的想要一个元组列表(我想你可能不应该!你失去了熊猫的所有优势!),你可以:

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

我给你举个例子

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)) 
将熊猫作为pd导入
#读取csv
s=pd.read\u csv(“stock.csv”,squence=True)
#定义检查价格的函数
def fun(num):

如果num=200并且numI认为您可能不想在这里使用apply。可能有一种矢量化的方法可以做到这一点,但我对地理坐标不太了解。这看起来像是y轴反射的组合(尽管如果这是意外的话,我不会感到惊讶!),由
xOrigin、yOrigin
和比例因子进行的转换。
list(df[['x_val', 'y_val']].itertuples(index=False, name=None))
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))