Python中字符串转浮点数速度慢,如何优化提速?
高效处理带格式问题的地理坐标字符串转换
核心优化思路:抛弃iterrows(),用Pandas矢量化操作
iterrows()是逐行迭代,每次迭代都会产生额外的对象开销,对于7000行数据来说完全没必要——Pandas的矢量化字符串方法是底层优化的,速度能提升几十甚至上百倍。
具体实现代码
针对你的坐标字符串格式(前导空格、正负号与数字间有空格),直接用字符串矢量化处理+类型转换:
import pandas as pd # 假设你的DataFrame是df,包含'latitude'和'longitude'列 # 处理纬度列 df['latitude'] = df['latitude'].str.strip() # 去除前后所有空格 df['latitude'] = df['latitude'].str.replace(r'(?<=[+-])\s', '', regex=True) # 去掉正负号后的空格 df['latitude'] = pd.to_numeric(df['latitude'], errors='coerce') # 转成浮点数,异常值转NaN # 处理经度列同理 df['longitude'] = df['longitude'].str.strip().str.replace(r'(?<=[+-])\s', '', regex=True).astype(float)
为什么模拟数据快、实际数据慢?
- 脏数据影响:实际数据集可能存在空值、非标准格式(比如多余字符),
iterrows()逐行处理时遇到异常会逐个抛出或处理,拖慢整体速度;而矢量化操作会批量处理,配合errors='coerce'能快速把异常值转成NaN,不影响整体效率。 - 迭代开销:
iterrows()每次迭代都会生成一个Series对象,7000次迭代的累计开销远大于矢量化的一次性批量处理。
进阶提速:合并操作减少中间步骤
可以把字符串处理和类型转换合并成一行,减少DataFrame的中间修改操作,进一步提速:
df['latitude'] = pd.to_numeric( df['latitude'].str.strip().str.replace(r'(?<=[+-])\s', '', regex=True), errors='coerce' )
验证异常数据
如果转换后有NaN,你可以快速定位异常行:
# 找出纬度转换失败的行 invalid_lat_rows = df[df['latitude'].isna()] print(invalid_lat_rows['latitude'])
内容的提问来源于stack exchange,提问作者brosenheim
相关产品推荐
相关产品推荐

