You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas展开JSON列仅得单行:员工历史数据处理需求

解决DataFrame中JSON数组列的多行展开问题

你遇到的问题核心是只处理了第一行的JSON数组,没有对每一行的数组进行拆分和全量展开。下面是完整的解决方案,一步步帮你实现需求:

问题分析

你的代码df[['alias','deptid','empid','mgnme','salary']] = pd.DataFrame.from_records(df['empjson'][0])只提取了empjson列的第一行数据来生成新列,自然只会得到单行结果。我们需要先把每一行的JSON数组拆分成单独的行,再展开每个JSON对象为对应字段列。

完整解决方案

步骤1:拆分JSON数组为多行

使用explode()方法将empjson列中的每个数组元素拆分成独立行,同时保留对应的empname:

df_exploded = df.explode('empjson', ignore_index=True)

步骤2:展开JSON对象为独立列

用pd.json_normalize()将拆分后的每个JSON对象展开成包含alias、deptid等指定字段的列:

df_normalized = pd.json_normalize(df_exploded['empjson'])

步骤3:合并结果列

将原empname列和展开后的字段列合并,得到最终的目标DataFrame:

final_df = pd.concat([df_exploded[['empname']], df_normalized], axis=1)

完整代码示例(含模拟数据)

import pandas as pd

# 模拟你的原始DataFrame
data = {
    'empname': ['David'],
    'empjson': [
        [
            {'alias': 'xxxxx', 'deptid': 'P1021', 'empid': 10749, 'mgnme': 'yyyyy', 'salary': 20123},
            {'alias': 'xxxxx', 'deptid': 'P1021', 'empid': 1829, 'mgnme': 'yyyyy', 'salary': 1061}
        ]
    ]
}
df = pd.DataFrame(data)

# 执行拆分和展开操作
df_exploded = df.explode('empjson', ignore_index=True)
df_normalized = pd.json_normalize(df_exploded['empjson'])
final_df = pd.concat([df_exploded[['empname']], df_normalized], axis=1)

# 查看结果
print(final_df)

运行后会得到你期望的输出:

empname  alias deptid  empid  mgnme  salary
0    David  xxxxx  P1021  10749  yyyyy   20123
1    David  xxxxx  P1021   1829  yyyyy    1061

补充:如果empjson是字符串格式的JSON

如果你的empjson列存储的是字符串类型的JSON(而非已经解析好的列表),需要先解析成Python列表,再执行上述步骤:

import json

# 先解析字符串为列表
df['empjson'] = df['empjson'].apply(json.loads)

# 再执行拆分和展开操作
df_exploded = df.explode('empjson', ignore_index=True)
df_normalized = pd.json_normalize(df_exploded['empjson'])
final_df = pd.concat([df_exploded[['empname']], df_normalized], axis=1)

内容的提问来源于stack exchange,提问作者muthu kumaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:17:34