解析Pandas中JSON格式字符串列时批量解析报错求助
Pandas批量解析JSON字符串列报错的排查与解决
问题背景
你正在处理Pandas中的MESSAGE_DATA__C列,该列存储JSON格式的字符串,示例行数据如下:
kafka_data["MESSAGE_DATA__C"].iloc[0] Out[20]: '{"userId":"af33f42e","trackingCategory":"ACTION","trackedItem":{"id":"PERSONAL_IDENTIFICATION_STARTED","category":"PERSONAL_IDENTIFICATION","title":"Personal Identification Started"}}'
单独解析某一行(json.loads(kafka_data["MESSAGE_DATA__C"].iloc[0]))可正常得到JSON对象,但批量解析整列时触发json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 212 (char 211)错误,需要将该列解析为新DataFrame。
可能的原因与解决方法
1. 列中存在格式不合法的JSON字符串
单独第一行正常不代表所有行都符合JSON规范,其他行可能存在引号不配对、转义字符缺失、语法错误等问题。
- 定位错误行:遍历列内容,捕获解析失败的行:
import json for idx, text in enumerate(kafka_data["MESSAGE_DATA__C"]): try: json.loads(text) except json.JSONDecodeError as e: print(f"错误行索引: {idx}, 内容片段: {text[:250]}, 错误位置: {e}")
- 处理方式:根据定位到的问题针对性修正(比如补全引号、转义特殊字符),或者直接跳过无效行继续解析。
2. 字符串包含隐藏的不可见字符
部分行可能存在换行符、制表符、非UTF-8控制字符等,导致解析失败。
- 清理字符串:先对列内容做预处理:
kafka_data["MESSAGE_DATA__C"] = kafka_data["MESSAGE_DATA__C"].str.strip() # 去除首尾空白 kafka_data["MESSAGE_DATA__C"] = kafka_data["MESSAGE_DATA__C"].str.replace(r'[\n\t\r]', '', regex=True) # 去除换行/制表/回车符
3. 批量解析未处理空值或异常行
如果列中存在NaN、空字符串等无效值,直接批量解析会触发错误。
- 过滤无效值后解析:
import pandas as pd # 过滤非空且非NaN的行 valid_rows = kafka_data[kafka_data["MESSAGE_DATA__C"].notna() & (kafka_data["MESSAGE_DATA__C"] != "")] # 解析为新DataFrame(普通JSON结构) parsed_df = valid_rows["MESSAGE_DATA__C"].apply(json.loads).apply(pd.Series) # 如果JSON有嵌套结构,用json_normalize展开 parsed_df = pd.json_normalize(valid_rows["MESSAGE_DATA__C"].apply(json.loads))
4. 字符串编码问题
少数情况下,字符串可能存在编码不兼容的字符,尝试转换编码:
kafka_data["MESSAGE_DATA__C"] = kafka_data["MESSAGE_DATA__C"].str.encode('utf-8', errors='ignore').str.decode('utf-8')
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

