如何将Pandas DataFrame中的坐标列拆分为多列?
解决CSV坐标字符串拆分问题
你的问题出在坐标字符串包含[]括号,直接拆分没处理这些冗余字符,导致结果不符合预期。这里给你三种实用的解决方法:
方法1:清理字符后拆分
先去掉字符串首尾的[],再按逗号拆分,最后清理空格并转成数值:
# 移除首尾的方括号 df['cleaned_loc'] = df['event_location'].str.strip('[]') # 按逗号拆分并展开为两列,同时清理每列的空格 df[['lat', 'long']] = df['cleaned_loc'].str.split(',', expand=True).apply(lambda col: col.str.strip()) # 转换为数值类型(可选,根据需求) df[['lat', 'long']] = df[['lat', 'long']].astype(float) # 可以删除临时的cleaned_loc列 df = df.drop('cleaned_loc', axis=1)
方法2:正则表达式提取数字
直接用正则匹配坐标里的数字(包括负数和小数),精准提取:
import re # 匹配数字的正则:支持负数、小数 num_pattern = r'-?\d+\.\d+' # 提取每个坐标字符串里的两个数字,转成列表后拆分到列 df[['lat', 'long']] = df['event_location'].apply(lambda x: re.findall(num_pattern, x)).tolist() # 转换为数值类型 df[['lat', 'long']] = df[['lat', 'long']].astype(float)
方法3:转成Python列表再拆分
如果坐标字符串本身是合法的列表格式(比如"[51.447084, -0.081564]"),可以用ast.literal_eval直接转成列表:
import ast # 将字符串转成列表,再拆分到两列 df[['lat', 'long']] = df['event_location'].apply(ast.literal_eval).tolist() # 确保是数值类型(eval后已经是float,这步可选) df[['lat', 'long']] = df[['lat', 'long']].astype(float)
为什么之前的方法失败?
- 第一种用
tolist()的方法:因为event_location列的每个元素是单个字符串,不是列表,赋值时会把整个字符串重复填充到两列。 - 第二种直接
str.split(',')的方法:拆分后第一列是"[51.447084"(带左括号),第二列是" -0.081564]"(带右括号和空格),如果某些行拆分后只有一个元素,还会导致long列空值。
内容的提问来源于stack exchange,提问作者savi
相关产品推荐
相关产品推荐

