新手求助:如何从Pandas Series的列表元组提取经纬度?
从Pandas Series中提取嵌套格式的地理坐标
我是Pandas新手,现有一个存储地理坐标的Series,Location字段的格式为包含单个元组的列表,需要从中提取纬度和经度到单独的Series,再合并回原DataFrame,但尝试多种方法均未成功。
尝试过的代码
- 以下代码返回list类型,但仅获取到Series的第一条记录:
df['Location'].str.split(',')[0] - 尝试将其视为字符串提取元素,同样失败:
longitude = df['Location'].str[0][0].replace('(', '')
示例数据
0 [(34.0255, -118.3002)] 1 [(34.0256, -118.3089)] 2 [(34.0738, -118.2078)] 3 [(34.0492, -118.2391)] 4 [(34.0108, -118.3182)] ... 594800 [(34.0436, -118.3053)] 594801 [(33.9572, -118.3962)] 594802 [(34.1684, -118.3982)] 594803 [(34.1976, -118.3965)] 594804 [(34.0504, -118.3442)]
解决方法
方法1:使用apply逐行提取(直观易懂)
利用apply遍历每个元素,先取出列表中的元组,再提取元组内的经纬度:
# 提取纬度(元组第一个元素) df['Latitude'] = df['Location'].apply(lambda x: x[0][0]) # 提取经度(元组第二个元素) df['Longitude'] = df['Location'].apply(lambda x: x[0][1])
方法2:使用Pandas的str索引访问(更简洁)
如果你的Pandas版本支持对列表类型的Series使用str索引,可以直接通过层级索引提取:
# 先取列表中的元组,再取元组的第0/1个元素 df['Latitude'] = df['Location'].str[0].str[0] df['Longitude'] = df['Location'].str[0].str[1]
方法3:批量构造DataFrame(适合大数据量)
将列表批量展开为DataFrame,再合并回原数据,效率更高:
# 将Location的列表转换为DataFrame,每个行对应一个元组 coords_df = pd.DataFrame(df['Location'].tolist(), index=df.index) # 将元组拆分为两列并命名 coords_df = coords_df.apply(pd.Series).rename(columns={0: 'Latitude', 1: 'Longitude'}) # 合并回原DataFrame df = df.join(coords_df)
为什么之前的方法失败?
- 第一种方法中,
df['Location'].str.split(',')是把每个元素当作字符串分割,而[0]是取分割后结果的第一行,并非逐行处理,所以只拿到第一条记录。 - 第二种方法错误地将列表类型的
Location当作字符串处理,str[0]取的是每个元素的第一个字符,而非列表中的元组,逻辑完全错误。
内容的提问来源于stack exchange,提问作者Cord
相关产品推荐
相关产品推荐

