使用gspread向Google Sheet写入DataFrame遇JSON合规性错误求助
解决「Out of range float values are not JSON compliant」错误
这个错误的核心原因是:Google Sheets API通过JSON格式传输数据,而你的DataFrame中包含了NaN、Infinity或-Infinity这类JSON标准不支持的特殊浮点值,导致序列化失败。以下是具体解决步骤:
1. 清理DataFrame中的特殊浮点值
先对要写入的DataFrame做预处理,把非JSON兼容的特殊值替换成合法内容(根据业务需求选择):
import pandas as pd import numpy as np # 假设你的DataFrame名为df # 方案1:替换为空字符串(推荐,对应Sheet中的空单元格) df_cleaned = df.replace([pd.NA, np.nan, np.inf, -np.inf], "") # 方案2:替换为业务允许的数值(比如无穷值替换为极大/极小值,NaN替换为0) # df_cleaned = df.replace([np.inf, -np.inf], 999999).fillna(0)
2. 确保用清理后的DataFrame写入
使用gspread_dataframe工具写入时,传入处理后的DataFrame:
from gspread_dataframe import set_with_dataframe # 获取或创建brand2工作表 worksheet_list = [ws.title for ws in spreadsheet.worksheets()] if "brand2" in worksheet_list: worksheet = spreadsheet.worksheet("brand2") else: # 按需调整行数和列数 worksheet = spreadsheet.add_worksheet(title="brand2", rows="1000", cols="20") # 写入清理后的数据 set_with_dataframe(worksheet, df_cleaned)
3. 读取数据时提前处理(可选)
从brand工作表读取数据时,可能因公式返回错误(比如#DIV/0!)被解析为无穷值,建议读取后立即清理:
# 读取brand工作表数据 brand_worksheet = spreadsheet.worksheet("brand") df = pd.DataFrame(brand_worksheet.get_all_records()) # 读取后直接清理特殊值 df = df.replace([np.inf, -np.inf], pd.NA).fillna("")
如果业务上需要保留特殊值的记录,可以将其转为字符串存储(比如把inf存为"inf"),但后续读取时需要额外做类型转换。
内容的提问来源于stack exchange,提问作者Cignitor
相关产品推荐
相关产品推荐

