Python中Pandas Series字符串转float失败及字符串列表转多表头DataFrame问题
解决Pandas字符串转浮点数错误+构建带自定义表头的DataFrame
嘿,我帮你梳理下代码里的几个坑,再一步步搞定你的问题:
一、原代码的核心问题
- 缩进&导入位置错误:
with open块没跟前面的列表定义正确缩进,而且import pandas居然放在了文件读取循环里,这会导致重复导入甚至语法报错。 - 字段提取完全错了:GPRMC格式里,
data[1]是UTC时间(比如123456),根本不是纬度!真正的纬度在data[2],经度在data[4],你提取错了字段,这才是转浮点数失败的头号原因! - 没做数据有效性校验:GPRMC里如果状态位是
V(无效定位),对应的经纬度字段是空的或者无效的,直接提取会拿到空字符串,转浮点数自然报错。
二、完整修正方案
下面是调整后的代码,同时解决字符串转浮点数、自定义表头DataFrame的问题:
# 先把库导入放在代码最开头,别混在逻辑里 import pandas as pd import numpy as np # 初始化存储经纬度的列表 lat_records = [] lon_records = [] # 读取日志文件,只提取有效GPRMC数据 with open("Rawcomdata.log") as fin: for line in fin: # 筛选GPRMC语句 if '$GPRMC' in line: # 按逗号分割字段,先去掉首尾的换行/空格 data = line.strip().split(',') # 确保字段足够,且是有效定位(状态位A) if len(data) >= 6 and data[2] == 'A': # 提取正确的经纬度字段 lat_str = data[2] lon_str = data[4] lat_records.append(lat_str) lon_records.append(lon_str) # 直接构建带自定义表头的DataFrame # 字典的键就是你想要的表头名称,值对应存储数据的列表 df = pd.DataFrame({ '观测纬度': lat_records, '观测经度': lon_records }) # 把字符串转成浮点数,无效值转成NaN后再替换为0(按你的需求) df['观测纬度'] = pd.to_numeric(df['观测纬度'], errors='coerce') df['观测经度'] = pd.to_numeric(df['观测经度'], errors='coerce') df.fillna(0, inplace=True) # 可选:把GPRMC的ddmm.mmmm格式转成常用的十进制度数(更实用) def to_decimal_degree(deg_min_str): if deg_min_str == 0: return 0 # 拆分度和分:前两位是度,后面的是分 degrees = float(str(deg_min_str)[:2]) minutes = float(str(deg_min_str)[2:]) return round(degrees + minutes / 60, 6) df['纬度_十进制'] = df['观测纬度'].apply(to_decimal_degree) df['经度_十进制'] = df['观测经度'].apply(to_decimal_degree) # 保存到CSV,去掉默认的索引列 df.to_csv('test.csv', index=False)
三、关键步骤说明
- 自定义表头的DataFrame构建:非常简单,在
pd.DataFrame()里传一个字典,键就是你要的表头名称,值是对应的数据列表就行,比如上面的'观测纬度'和'观测经度'就是自定义的表头。 - 字符串转浮点数的容错处理:用
pd.to_numeric(..., errors='coerce')把所有无法转成数字的内容(比如空字符串、乱码)转成NaN,再用fillna(0)把NaN替换成0,彻底避免转换错误。 - 有效数据过滤:加入
data[2] == 'A'的判断,只保留有效定位的数据,减少无效值的干扰。
四、排查剩余转换错误的小技巧
如果还是有转浮点数的问题,你可以先打印出那些无法转换的字符串,精准定位问题:
# 找出所有无法转成浮点数的纬度字符串 invalid_lats = df[pd.to_numeric(df['观测纬度'], errors='coerce').isna()]['观测纬度'] print("导致转换失败的纬度内容:", invalid_lats.tolist())
这样就能快速找到日志里的异常行,针对性处理啦。
内容的提问来源于stack exchange,提问作者Poka
相关产品推荐
相关产品推荐

