如何将JSON多维数组转为Pandas独立列(嵌套状态数据处理)
解决方案:将嵌套状态数组转为独立列并计算耗时
核心思路
先把嵌套的status数组拆分为每行对应一个状态记录,再通过透视表将状态转为独立列,最后合并回原数据并计算耗时。
具体步骤(假设status数组元素为含status和timestamp字段的字典)
展开嵌套数组
将每个订单的status数组拆分为多行,保留订单唯一标识(如orderid):# 展开status数组,每个状态占一行,重置索引避免混乱 expanded_df = df.explode('status').reset_index(drop=True)解析状态字典
把status字段里的嵌套字典拆成单独的status_name和timestamp列:# 将字典转为DataFrame并合并到原表 status_details = pd.DataFrame(expanded_df['status'].tolist(), index=expanded_df.index) expanded_df = pd.concat([expanded_df.drop('status', axis=1), status_details], axis=1) # 重命名列(如果原字典键名不是status/timestamp,替换为实际键名) expanded_df.rename(columns={'status': 'status_name'}, inplace=True)透视生成独立状态列
以orderid为行索引,将不同状态转为列,对应值为状态时间戳:# 透视表:每个orderid一行,每个状态对应一列 status_pivot = expanded_df.pivot( index='orderid', columns='status_name', values='timestamp' ).reset_index()合并回原数据并计算耗时
合并原表的其他字段(去重后),并转换时间格式计算耗时:# 保留原表每个orderid的唯一行,合并状态列 final_df = df.drop_duplicates('orderid').merge(status_pivot, on='orderid') # 转换时间戳为datetime类型 final_df['order confirmed'] = pd.to_datetime(final_df['order confirmed']) final_df['pick up confirmed'] = pd.to_datetime(final_df['pick up confirmed']) # 计算从订单确认到取件确认的耗时(单位:小时,可按需改为分钟/秒) final_df['confirm_to_pickup_hours'] = ( final_df['pick up confirmed'] - final_df['order confirmed'] ).dt.total_seconds() / 3600
特殊情况处理
- 如果部分订单缺少目标状态(如无
pick up confirmed记录),结果会出现NaN,可通过fillna()标记或过滤:# 标记缺失状态的订单 final_df['confirm_to_pickup_hours'] = final_df['confirm_to_pickup_hours'].fillna('未完成取件') - 如果
status数组的结构不同(如键名不是status/timestamp),只需替换代码中对应的列名即可。
内容的提问来源于stack exchange,提问作者nitin bhatt
相关产品推荐
相关产品推荐

