You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:00:30