使用Pandas处理类JSON列:拆分多行并提取指定字段
处理非标准类JSON列的拆分与字段提取
核心思路
先把每个单元格里的多个类JSON结构拆分出来,展开成多行(保留原标识符),再精准提取目标字段。下面用代码一步步实现:
步骤1:导入依赖并构造示例数据
import pandas as pd import re # 模拟你的数据结构 data = { 'id': [1, 2, 3], 'json_col': [ '"{immediateJob : ""DIA"",Trimester :""Q"",Year :""}"', '"{immediateJob : ""Responsable conformité"",Trimester :""Q3"",Year :""2022""}{immediateJob : ""Responsable projet"",Trimester :""Q3"",Year :""2022""}"', pd.NA ] } df = pd.DataFrame(data)
步骤2:清理原始数据并提取结构
# 处理空值,同时去掉原始字符串外层多余的双引号 df['json_clean'] = df['json_col'].fillna('').str.strip('"') # 定义正则表达式,匹配每个独立的{...}结构,并提取三个字段的值 # 正则会自动忽略字段间的空格,适配你的格式 pattern = r'\{immediateJob\s*:\s*""(.*?)""\s*,\s*Trimester\s*:\s*""(.*?)""\s*,\s*Year\s*:\s*""(.*?)""\s*\}' # 提取每个单元格里的所有匹配结果,得到列表形式的元组(每个元组对应一个结构的三个字段) df['matches'] = df['json_clean'].apply(lambda x: re.findall(pattern, x))
步骤3:拆分多行并生成最终结果
# 将列表拆分为多行,保留原始标识符id df_exploded = df.explode('matches').drop(columns=['json_col', 'json_clean']) # 把元组格式的匹配结果拆分成单独的列 df_exploded[['immediateJob', 'Trimester', 'Year']] = pd.DataFrame( df_exploded['matches'].tolist(), index=df_exploded.index ) # 清理临时列,得到最终数据 df_final = df_exploded.drop(columns=['matches'])
最终效果
运行后df_final的结果如下:
| id | immediateJob | Trimester | Year |
|---|---|---|---|
| 1 | DIA | Q | |
| 2 | Responsable conformité | Q3 | 2022 |
| 2 | Responsable projet | Q3 | 2022 |
| 3 |
适配扩展
如果你的字段顺序不固定(比如有的结构里Year在最前面),可以用下面的正则来适配任意顺序:
pattern = r'\{.*?immediateJob\s*:\s*""(.*?)""|.*?Trimester\s*:\s*""(.*?)""|.*?Year\s*:\s*""(.*?)""' # 注意:这种情况需要调整提取逻辑,确保字段对应正确,比如用re.finditer逐个匹配字段
内容的提问来源于stack exchange,提问作者Thomas Peyre
相关产品推荐
相关产品推荐

