从DataFrame的rawrecord列提取JSON键值对遇类型错误求助
解决JSON解析错误:"the JSON object must be str, bytes or bytearray, not float"
问题原因
错误说明你的rawrecord列中存在非字符串类型的值(大概率是NaN,在pandas中以float类型存储),导致json.loads()无法解析。即使你提供的示例数据全是JSON字符串,实际数据集里可能存在缺失值或格式异常的行。
解决方案
1. 先检查列中数据类型分布
运行以下代码确认是否存在非字符串元素:
print(df_json['rawrecord'].apply(type).value_counts())
如果输出中有<class 'float'>,说明存在NaN值。
2. 方案一:清洗列数据后解析
将所有值转为字符串,把NaN替换为合法空JSON对象,再进行解析:
import json import pandas as pd # 将列转为字符串,替换NaN为'{}' df_json['rawrecord'] = df_json['rawrecord'].astype(str).replace('nan', '{}') # 解析JSON并合并到原DataFrame df_json = df_json.join(df_json['rawrecord'].apply(lambda x: pd.Series(json.loads(x))))
3. 方案二:带异常处理的解析函数
针对每个元素做类型检查和异常捕获,避免单个错误中断整个过程:
import json import pandas as pd def safe_parse_json(x): if isinstance(x, str): try: return pd.Series(json.loads(x)) except json.JSONDecodeError: # 解析失败时返回空Series return pd.Series() else: # 非字符串类型返回空Series return pd.Series() df_json = df_json.join(df_json['rawrecord'].apply(safe_parse_json))
4. 方案三:使用pandas内置的json_normalize(更高效)
对于大数据集,json_normalize比逐行apply性能更好:
from pandas import json_normalize import json # 过滤或转换非字符串值 valid_raw = df_json['rawrecord'].apply(lambda x: x if isinstance(x, str) else '{}') # 解析JSON并生成新DataFrame parsed_data = json_normalize(valid_raw.apply(json.loads)) # 合并到原DataFrame df_json = pd.concat([df_json, parsed_data], axis=1)
内容的提问来源于stack exchange,提问作者unicorn
相关产品推荐
相关产品推荐

