如何将DataFrame中JSON字符串列解析为同DataFrame的新列?
Pandas解析JSON字符串列报错的解决方法
问题说明
现有如下包含JSON字符串列的Pandas DataFrame:
import pandas as pd df = pd.DataFrame([{'sno':1, 'values':"[{'a':1, 'b':2,'c':3}]"}, {'sno':2, 'values':"[{'a':4, 'b':5,'c':6}]"}])
尝试通过assign结合json.loads解析JSON列生成新列时,触发错误:the JSON object must be str, bytes or bytearray, not Series。问题出在lambda中json.loads直接处理了整个Series,而非每行的单独字符串。我们需要将JSON列解析为如下结构的DataFrame:
sno a b c ------------------------ 1 1 2 3 2 4 5 6
可行解决方法
方法1:apply逐行解析+拼接DataFrame
利用apply对values列的每个字符串单独解析,再将解析后的字典转为DataFrame,最后和原DataFrame的sno列合并:
import json import pandas as pd # 替换单引号为双引号后解析JSON,取列表第一个元素 parsed_dicts = df['values'].apply(lambda x: json.loads(x.replace("'", "\""))[0]) # 合并原sno列和解析后的DataFrame result_df = pd.concat([df['sno'], pd.DataFrame(parsed_dicts.tolist())], axis=1) print(result_df)
注意:原生
json.loads仅支持双引号包裹的JSON格式,因此需要先替换字符串中的单引号。
方法2:使用pd.json_normalize解析
json_normalize专门用于解析JSON数据,配合apply预处理字符串后直接解析:
import json import pandas as pd # 预处理字符串为可解析的JSON对象 df['values'] = df['values'].apply(lambda x: json.loads(x.replace("'", "\""))[0]) # 解析JSON列并与原sno列合并 result_df = df['sno'].to_frame().join(pd.json_normalize(df['values'])) print(result_df)
方法3:eval解析(仅适用于可信数据)
如果数据来源完全可信,可以用eval直接解析单引号格式的JSON字符串,省去替换引号的步骤:
import pandas as pd parsed_dicts = df['values'].apply(lambda x: eval(x)[0]) result_df = pd.concat([df['sno'], pd.DataFrame(parsed_dicts.tolist())], axis=1) print(result_df)
警告:
eval会执行字符串中的任意代码,若数据包含恶意内容,会引发安全风险,非必要不使用。
内容的提问来源于stack exchange,提问作者user3625533
相关产品推荐
相关产品推荐

