如何拆分含多组key:value对的车辆路由DataFrame列?
问题描述
我有一个车辆数据集,最后一列是名为route的路由信息,数据格式为包含单个字典的数组:
[{ "longitude": 101, "latitude": 3, "timestamp": 2, "accuracy": 0.5, "hdop": 1 }]
部分坐标数据可能缺少accuracy或hdop字段。我需要将这一列拆分为longitude、latitude、timestamp、accuracy、hdop单独的列,最终得到结构化表格。
我已经尝试了以下代码:
import csv import json import ast import pandas as pd # 将数据读取到Pandas DataFrame中 df = pd.read_csv('Trips Jan Week 1.csv') df['route'] = pd.Series(df['route'],dtype="string") # 将最后一列提取为字符串类型 routes = df.iloc[:, -1].astype(str) # 解析JSON前去除首尾字符 routes2 = routes.apply(lambda x: x.strip('[]').strip()) print(routes2) print(type(routes2))
运行后得到的routes2是包含单个JSON对象字符串的Series,但还没完成拆分。
期望输出的表格格式:
| Longitude | Latitude | Timestamp | Accuracy | Hdop |
|---|---|---|---|---|
| 101 | 3 | 2 | 0.5 | 1 |
解决方法
你已经完成了最关键的第一步——去除数组的首尾括号,接下来只需要解析JSON并展开为列即可,具体步骤如下:
解析JSON字符串为字典
考虑到部分数据可能存在格式小问题(比如单引号),用ast.literal_eval比json.loads兼容性更好,执行解析:# 解析每个字符串为字典 parsed_routes = routes2.apply(ast.literal_eval)将字典展开为结构化列
使用pd.json_normalize可以直接把字典序列转换成DataFrame,自动处理缺失字段(缺失的accuracy或hdop会填充为NaN):# 展开字典为DataFrame route_df = pd.json_normalize(parsed_routes)合并原数据集与拆分后的路由数据(可选)
如果需要保留原数据的其他列,直接将拆分后的DataFrame与原DataFrame拼接:# 合并数据 final_df = pd.concat([df.drop('route', axis=1), route_df], axis=1)
完整代码
import pandas as pd import ast # 读取数据集 df = pd.read_csv('Trips Jan Week 1.csv') # 处理route列:转为字符串并去除首尾数组括号 df['route'] = df['route'].astype(str).apply(lambda x: x.strip('[]').strip()) # 解析JSON字符串为字典 parsed_routes = df['route'].apply(ast.literal_eval) # 展开为结构化列 route_df = pd.json_normalize(parsed_routes) # 合并原数据与拆分后的路由数据(如果不需要原数据其他列,直接用route_df即可) final_df = pd.concat([df.drop('route', axis=1), route_df], axis=1) # 查看结果 print(final_df.head())
说明
- 对于缺失的
accuracy或hdop字段,pd.json_normalize会自动填充为NaN,你可以根据需求用fillna()填充默认值(比如route_df.fillna(0, inplace=True))。 - 如果你的
route列中存在多个字典(即一个数组里有多个坐标点),需要先将每个数组展开为多行再拆分,但根据你的示例,每个数组只有一个字典,上述代码完全适用。
内容的提问来源于stack exchange,提问作者Pranav Ramsahye
相关产品推荐
相关产品推荐

