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
相关产品推荐
相关产品推荐

