You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:25:37