如何在Python中将经纬度合并至同一列并添加坐标类型区分列
解决经纬度列转长格式的Python方案
你的思路完全可行,但用pandas的melt函数会更高效,尤其适合你这种需要保留多列、仅转换特定列的场景,下面给你两种实现方式:
方法一:用pandas.melt(推荐)
这是处理宽表转长表的标准方法,一行核心代码就能搞定,还能自动保留所有其他列:
代码示例
import pandas as pd # 模拟你的实际数据(包含额外列) df = pd.DataFrame({ "Location": ["Place1", "Place2"], "Latitude": [32.123, 31.321], "Longitude": [120.123, 121.321], "City": ["Shanghai", "Nanjing"], "Population": [24870895, 9314685] }) # 执行转换:id_vars指定需要保留的所有非经纬度列 result = pd.melt( df, id_vars=["Location", "City", "Population"], # 替换成你实际要保留的十余列 var_name="Lat/Long", value_name="Coords" ) # 可选:按Location排序,让结果更整洁 result = result.sort_values("Location").reset_index(drop=True) print(result)
参数说明
id_vars: 填写所有不需要拆分的列名(比如你的十余列),这些列会原样保留,每一行经纬度数据都会对应这些列的值var_name: 对应你要的"Lat/Long"列,用来标记是纬度还是经度value_name: 对应你要的"Coords"列,存放经纬度的数值
方法二:按你的思路手动拆分合并
如果想按你最初的想法落地,步骤如下:
代码示例
import pandas as pd # 同样用上面的模拟数据 df = pd.DataFrame({ "Location": ["Place1", "Place2"], "Latitude": [32.123, 31.321], "Longitude": [120.123, 121.321], "City": ["Shanghai", "Nanjing"], "Population": [24870895, 9314685] }) # 拆分纬度DataFrame df_lat = df.copy() df_lat["Lat/Long"] = "Latitude" df_lat["Coords"] = df_lat["Latitude"] # 只保留需要的列 df_lat = df_lat[["Location", "City", "Population", "Lat/Long", "Coords"]] # 拆分经度DataFrame df_lon = df.copy() df_lon["Lat/Long"] = "Longitude" df_lon["Coords"] = df_lon["Longitude"] df_lon = df_lon[["Location", "City", "Population", "Lat/Long", "Coords"]] # 合并两个DataFrame result = pd.concat([df_lat, df_lon]).sort_values("Location").reset_index(drop=True) print(result)
两种方法最终输出的结果完全一致,第一种方法更简洁,适合处理大量列的场景;第二种方法逻辑直观,适合新手理解。
内容的提问来源于stack exchange,提问作者TravisB
相关产品推荐
相关产品推荐

