如何将DataFrame列中含=的非JSON嵌套数组拆分为多列?
解决非标准键值格式的DataFrame列拆分问题
这个场景确实挺棘手——这种用=而非:的非标准"类JSON"格式,json_normalize自然没法直接识别。不过我们可以通过自定义解析先把格式转换成标准JSON结构,再完成拆分,具体步骤如下:
核心思路
- 将每个非标准对象(比如
{lockstatus=0, openstatus=0})转换成标准JSON格式({"lockstatus":0, "openstatus":0}) - 把整列的非标准数组转成Python字典列表
- 用
explode将每个字典拆成单独行,再用json_normalize展开为多列
完整代码示例
假设你的DataFrame里有一列叫status_array,存储着你描述的非标准数组数据,我们可以这么处理:
import pandas as pd import re import json # 模拟你的原始DataFrame df = pd.DataFrame({ 'record_id': [1, 2], 'status_array': [ '[ {lockstatus=0, openstatus=0, enablestatus=0}, {lockstatus=1, openstatus=1, enablestatus=1} ]', '[ {lockstatus=0, openstatus=0, enablestatus=0} ]' ] }) # 自定义解析函数:把非标准格式转成标准字典列表 def parse_non_standard_json(s): # 用正则把 key=value 替换为 "key":value normalized_str = re.sub(r'(\w+)=', r'"\1":', s) # 解析成Python原生的字典列表 return json.loads(normalized_str) # 1. 将原始列转换为标准字典列表 df['parsed_status'] = df['status_array'].apply(parse_non_standard_json) # 2. 展开每个字典为单独行 df_exploded = df.explode('parsed_status', ignore_index=True) # 3. 把字典拆分为单独列,并保留原始ID列 final_df = pd.json_normalize(df_exploded['parsed_status']).join(df_exploded[['record_id']]) # 查看结果 print(final_df)
关键细节说明
- 正则表达式
re.sub(r'(\w+)=', r'"\1":', s):匹配所有单词格式的键,给它们加上双引号,并把=替换为JSON标准的:,完美适配你给出的示例格式 - 如果你的原始列不是字符串,而是已经加载为列表(每个元素是类似自定义对象的结构),可以调整解析函数,遍历列表中的每个对象,把每个对象的键值对转成标准字典
explode函数负责把列表中的每个元素拆成单独行,确保每个状态对象对应一条独立记录
内容的提问来源于stack exchange,提问作者Ilsu kazkayası
相关产品推荐
相关产品推荐

