Python Pandas新手求助:从数据库JSON列提取数据构建拆分列DataFrame
解决从JSON列拆分数据到DataFrame的问题
嘿,作为Pandas新手遇到这种嵌套JSON的拆分需求很正常,我来一步步帮你把Profile列里的JSON数据拆成独立的DataFrame列,包括Role里的子项~
整体思路
我们会先把数据库里的Employees表读进Pandas DataFrame,然后把Profile列的JSON字符串解析成Python字典,最后用json_normalize把嵌套的字典展开成单独的列。
步骤1:导入所需库并读取数据库数据
首先得导入必要的库,然后连接你的数据库(这里以SQLAlchemy为例,你可以换成自己用的数据库连接方式,比如pymysql配合read_sql):
import pandas as pd import json from sqlalchemy import create_engine # 替换成你的数据库连接字符串,比如MySQL、PostgreSQL等格式 engine = create_engine('your_database_connection_string') # 读取Employees表到DataFrame df = pd.read_sql('SELECT * FROM Employees', engine)
步骤2:解析Profile列的JSON字符串
Profile列现在是字符串格式,我们需要把它转成Python字典,方便后续展开:
# 处理可能的无效JSON(比如空字符串、格式错误),避免代码报错 def parse_json(json_str): try: return json.loads(json_str) except (json.JSONDecodeError, TypeError): # 解析失败时返回空字典,保证后续流程正常 return {} # 把解析函数应用到Profile列 df['Profile'] = df['Profile'].apply(parse_json)
步骤3:展开JSON数据为独立列
用pd.json_normalize把Profile列的字典(包括嵌套的Role字典)展开成单独的列,再和原DataFrame合并:
# 展开Profile列的JSON数据,嵌套的Role会自动生成带前缀的列 profile_df = pd.json_normalize(df['Profile']) # 合并原表(去掉Profile列)和展开后的JSON列 final_df = pd.concat([df.drop('Profile', axis=1), profile_df], axis=1) # 自定义列名,把默认的"Role.Support"改成你想要的"Role(Support)"格式 final_df = final_df.rename(columns={ 'Role.Support': 'Role(Support)', 'Role.Troubleshoot': 'Role(Troubleshoot)', 'Role.Update KBarticles': 'Role(Update KBarticles)' })
最终效果
运行完上面的代码后,final_df就会包含你想要的所有独立列:EmpID、Department、Role(Support)、Role(Troubleshoot)、Role(Update KBarticles)、Team_name、Date_Joined,同时保留原Employees表的其他列~
小提示
如果你的Profile列里有部分JSON格式不一致,parse_json函数里的try-except会帮你跳过错误,返回空字典,避免整个代码崩溃。你可以根据实际情况调整这个函数的处理逻辑哦。
内容的提问来源于stack exchange,提问作者Taukheer
相关产品推荐
相关产品推荐

