使用pd.json_normalize解析CSV中properties字段返回空DataFrame的问题
解决pd.json_normalize解析CSV中properties字段返回空DataFrame的问题
问题重现
原始CSV数据
cardinality|create_time|properties 382|2022-04-05 16:32:43.000+0000|{'birthday': '542217600000', 'first_name': 'Char', 'gender': 'Male', 'last_name': 'Mander', 'nick_name': ''} 400|2022-02-07 14:20:59.000+0000|{'birthday': '967046400000', 'first_name': 'ABC', 'gender': 'Male', 'last_name': 'ZXY', 'nick_name': ''} 132|2021-08-09 14:01:30.000+0000|{'birthday': '739900800000', 'first_name': 'Test', 'gender': 'Male', 'last_name': 'Tickles', 'nick_name': ''}
执行代码
with open ('input.csv' ,'r') as data1: df1 = pd.read_csv(data1, encoding='utf-8', dtype= 'object', sep='|') df1=df1['properties'] print(pd.json_normalize(df1))
错误结果
Empty DataFrame Columns: [] Index: [0, 1, 2]
期望输出
birthday first_name gender last_name nick_name 0 542217600000 Char Male Mander 1 967046400000 ABC Male ZXY 2 739900800000 Test Male Tickles
问题原因
pd.json_normalize要求输入是可解析的JSON对象(如字典列表),但当前properties列的内容是单引号包裹的Python字典格式字符串,并非标准JSON(标准JSON使用双引号),直接传入无法被识别,因此返回空DataFrame。
解决方案
步骤1:修复CSV读取格式(可选)
原CSV数据中所有记录挤在同一行,需要先拆分记录再构建DataFrame。如果你的CSV是每条记录单独一行,可跳过此步骤。
步骤2:将字符串转为Python字典
使用ast.literal_eval(安全解析Python字面量)将单引号字典字符串转为真实字典,避免eval的安全风险。
完整代码
import pandas as pd import ast # 读取并处理CSV数据 with open('input.csv', 'r') as data1: content = data1.read() # 拆分表头和记录(原数据用空格分隔不同记录) parts = content.split(' ') parts = [p for p in parts if p.strip()] # 过滤空内容 header = parts[0].split('|') # 拆分每条记录的字段 records = [line.split('|') for line in parts[1:]] df1 = pd.DataFrame(records, columns=header) # 将properties列的字符串转为字典 df1['properties'] = df1['properties'].apply(ast.literal_eval) # 解析字典得到结构化数据 normalized_df = pd.json_normalize(df1['properties']) print(normalized_df)
执行结果
运行后将得到期望的结构化DataFrame:
birthday first_name gender last_name nick_name 0 542217600000 Char Male Mander 1 967046400000 ABC Male ZXY 2 739900800000 Test Male Tickles
内容的提问来源于stack exchange,提问作者chichi
相关产品推荐
相关产品推荐

