在Python Pandas中使用pyproj转换经纬度时语法错误求助
问题解决
语法错误原因
你的lambda表达式使用三元运算符时仅写了if分支,缺少else分支。apply要求每一行必须返回对应值,当row.epsg == 4326时当前代码无返回内容,触发语法错误。
额外逻辑问题
调用转换函数时参数顺序错误:transfform_lat_long中设置了always_xy=True,意味着proj.transform需要先传入经度(x)、再传入纬度(y),但你当前传的是row.latitude(纬度)和row.longitude(经度),顺序颠倒会导致转换结果完全错误。
修正后的代码
完整可运行代码
import pandas as pd import pyproj df = pd.DataFrame( { 'epsg': [4326, 4326, 4326, 4203, 7844], 'latitude': [-34.58, -22.78, -33.45, -33.60, -30.48], 'longitude': [122.31, 120.2, 118.55, 140.77, 115.88]}) def transfform_lat_long(inproj:int, outproj:int, x1, y1): proj = pyproj.Transformer.from_crs(inproj, outproj, always_xy=True) x2, y2 = proj.transform(x1, y1) return outproj, y2, x2 # 对应epsg、纬度、经度的返回顺序 # 应用函数到DataFrame df[['epsg','latitude', 'longitude']] = df.apply(lambda row: transfform_lat_long(row.epsg, 4326, row.longitude, row.latitude) # 交换经度和纬度的传入顺序 if row.epsg != 4326 else (row.epsg, row.latitude, row.longitude), # else分支返回原数据 axis=1 ) print(df)
关键修正点
- 补充三元运算符的
else分支,当epsg为4326时直接返回原行的epsg、纬度、经度值,确保每一行都有返回内容。 - 调用转换函数时,将
row.longitude(经度,x轴)放在前面,row.latitude(纬度,y轴)放在后面,符合always_xy=True的参数要求。 - 调整函数返回值顺序为
(outproj, y2, x2),匹配DataFrame的epsg、latitude、longitude列顺序。
内容的提问来源于stack exchange,提问作者kitchenprinzessin
相关产品推荐
相关产品推荐

