如何将pandas DataFrame的坐标列表列拆分为相邻点对多行数据
最优实现方案
你可以用pandas内置的apply+explode组合实现需求,代码简洁且性能远高于手动循环,还能自动保留原有行的其他属性:
步骤1:预处理坐标列(必填)
从CSV读取的嵌套列表默认是字符串格式,需要先转为Python列表对象:
import pandas as pd import ast # 假设已通过read_csv读取数据到bike_path_df bike_path_df['coordinates'] = bike_path_df['coordinates'].apply(ast.literal_eval)
步骤2:生成相邻点对
用zip配对当前点和下一个点,比手动判断索引的写法更简洁高效:
def get_pairs(point_list): # p1为当前点,p2为下一个点,拼接为[起点经度, 起点纬度, 终点经度, 终点纬度]格式 return [ [*p1, *p2] for p1, p2 in zip(point_list[:-1], point_list[1:]) ] bike_path_df['coordinate_pair'] = bike_path_df['coordinates'].apply(get_pairs)
步骤3:拆分为单行点对
用explode方法把每行的点对列表拆分为独立行,原有行的其他属性会自动重复填充:
# ignore_index=True会重置行号,避免重复索引 result_df = bike_path_df.explode('coordinate_pair', ignore_index=True) # 不需要原coordinates列可手动删除 result_df = result_df.drop('coordinates', axis=1)
可选扩展:拆分坐标为独立列
如果需要把四个坐标值拆分为单独的列,可追加以下代码:
result_df[['start_lng', 'start_lat', 'end_lng', 'end_lat']] = pd.DataFrame( result_df['coordinate_pair'].tolist(), index=result_df.index )
原问题说明:之前的方法出现维度不匹配是因为手动生成的all_list长度和原DataFrame行数一致,每个元素是当前路径的所有点对集合,而你需要的输出总长度是所有路径点对的数量之和,explode就是专门处理这类列表列拆分为多行的场景。
内容的提问来源于stack exchange,提问作者Ecaloota
相关产品推荐
相关产品推荐

