Python DataFrame替换N/S为+/-报错求助(地图散点图需求)
搞定DataFrame经纬度转正负数值的问题
嘿,我来帮你解决这个问题!先看看你原代码里的几个小坑:
range(1)只会处理第1行(索引0),没法覆盖所有数据;- Python里没有
else if,正确写法是elif,而且你的缩进也不对,elif得和对应的if保持同级; - 直接用
df.iloc[i]赋值容易因为列不匹配报错,得明确是处理纬度还是经度列。
下面给你两种解决方案,一种是适合新手理解的逐行循环写法,另一种是Pandas专属的高效批量处理方法(强烈推荐后者,毕竟Pandas就是用来帮我们摆脱手动循环的😉)。
方案1:新手友好的逐行循环
假设你的location DataFrame里,纬度的数值和方向是分开的列(比如第0列是数值,第2列是N/S),经度同理。你可以这样写:
import pandas as pd # 替换成你自己的实际DataFrame哦 location = pd.DataFrame({ 'lat_value': ['35.12', '40.56', '28.98'], 'lat_dir': ['N', 'S', 'N'], 'lon_value': ['120.34', '110.78', '105.23'], 'lon_dir': ['E', 'W', 'E'] }) # 创建用来存处理后经纬度的空DataFrame df = pd.DataFrame(columns=['latitude', 'longitude']) # 遍历每一行处理 for i in range(len(location)): # 处理纬度:N为正,S为负 lat_num = float(location.iloc[i]['lat_value']) lat_dir = location.iloc[i]['lat_dir'] if lat_dir == 'N': final_lat = lat_num elif lat_dir == 'S': final_lat = -lat_num # 处理经度:E为正,W为负 lon_num = float(location.iloc[i]['lon_value']) lon_dir = location.iloc[i]['lon_dir'] if lon_dir == 'E': final_lon = lon_num elif lon_dir == 'W': final_lon = -lon_num # 把结果存入新的DataFrame df.loc[i] = [final_lat, final_lon] print(df)
方案2:高效的Pandas批量处理(推荐)
如果你的经纬度是像"35.12N"或者"120.34 W"这样的格式(数值和方向连在一起或用空格分隔),用apply方法可以一键批量转换,代码更简洁还更快:
import pandas as pd # 示例数据,替换成你的真实数据 location = pd.DataFrame({ 'latitude_str': ['35.12N', '40.56S', '28.98 N'], 'longitude_str': ['120.34E', '110.78W', '105.23 W'] }) # 定义转换纬度的函数 def process_latitude(lat_str): # 处理带空格的情况,先拆分再提取 if ' ' in lat_str: num_part, dir_part = lat_str.split() else: num_part = lat_str[:-1] dir_part = lat_str[-1] num = float(num_part) return num if dir_part == 'N' else -num # 定义转换经度的函数 def process_longitude(lon_str): if ' ' in lon_str: num_part, dir_part = lon_str.split() else: num_part = lon_str[:-1] dir_part = lon_str[-1] num = float(num_part) return num if dir_part == 'E' else -num # 批量转换整列数据 df = pd.DataFrame() df['latitude'] = location['latitude_str'].apply(process_latitude) df['longitude'] = location['longitude_str'].apply(process_longitude) print(df)
这样处理完之后,df里就是带正负号的经纬度数值啦,直接拿去画散点图完全没问题~
内容的提问来源于stack exchange,提问作者Jiyeon Mun
相关产品推荐
相关产品推荐

