如何在Python Pandas中用apply处理两列实现ITM转WGS-84坐标
解决Pandas两列坐标转换为WGS84的问题
核心方案:利用pyproj批量转换或逐行处理
首先明确ITM坐标系的EPSG代码是2039,WGS84是4326。pyproj的Transformer支持批量处理整列数据(效率更高),也可以通过apply(axis=1)逐行处理,两种方法都能解决你的问题。
步骤1:导入依赖并创建转换器
import pandas as pd from pyproj import Transformer # 初始化ITM转WGS84的转换器,always_xy=True确保坐标顺序匹配CRS定义 transformer = Transformer.from_crs("EPSG:2039", "EPSG:4326", always_xy=True)
步骤2:处理数据集
假设你的数据集是df,包含x(ITM东向坐标)和y(ITM北向坐标)列。
方法一:矢量化批量转换(推荐,大数据集高效)
直接将整列数据传入转换器,无需逐行循环:
# 批量转换,返回经度(lon)、纬度(lat) lon, lat = transformer.transform(df['x'].values, df['y'].values) # 将结果添加到原数据框,按你的需求命名列 df['X'] = lat # 对应示例中的33.04647(纬度) df['Y'] = lon # 对应示例中的35.56525(经度)
方法二:逐行apply处理(适合小数据集)
如果你需要自定义逻辑,可以用apply(axis=1)逐行传入x、y值:
def convert_row(row): # 转换当前行的x、y坐标 lon, lat = transformer.transform(row['x'], row['y']) # 返回Series,对应新列的取值 return pd.Series([lat, lon], index=['X', 'Y']) # 应用函数并合并结果到原数据框 df[['X', 'Y']] = df.apply(convert_row, axis=1)
关键说明
always_xy=True必须设置:ITM的x/y对应东/北向,WGS84的坐标顺序是经度(lon)/纬度(lat),该参数确保转换器使用正确的坐标映射。- 你之前直接用
apply失败的原因:默认apply是按列处理,函数会收到整列数据而非单行的x、y值,指定axis=1后才会按行传递数据。
内容的提问来源于stack exchange,提问作者Chubix34
相关产品推荐
相关产品推荐

