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

基于JSON创建Pandas DataFrame时formid赋值不符合预期问题排查

问题排查与修复

问题根源

你的代码存在三个核心逻辑错误,导致所有行的formid值相同:

  1. 重复初始化DataFrame:外层循环每次都执行form_submissions = pd.DataFrame(),第一次表单的处理结果会被第二次循环完全覆盖,最终只保留最后一次循环的处理结果。
  2. 数据重复追加:submissions.extend(r_json_online["results"])在每次外层循环都追加同一个数据集,导致submissions里包含重复的提交数据,且最终所有数据都使用最后一次循环的formid[i]。
  3. 字段添加逻辑混乱:通过单独追加createdOn和formid行再用bfill填充的方式,不仅效率低下,还容易导致字段错位,进一步加剧数据错误。

修复后的代码

假设你是针对每个formid单独调用API获取对应提交数据(即每次外层循环应获取当前formid的results),修复后的代码如下:

import pandas as pd
from pandas import json_normalize

formid_list = ["61438732", "48247759dc"]
form_submissions = pd.DataFrame()

# 遍历每个表单ID
for form_id in formid_list:
    # 这里替换为针对当前form_id调用API获取r_json_online的逻辑
    # 示例:r_json_online = requests.get(f"API_URL?formid={form_id}").json()
    current_results = r_json_online["results"]
    
    # 处理当前表单的所有提交
    for submission in current_results:
        # 解析提交的字段值
        submission_df = json_normalize(submission["values"])
        # 直接添加createdOn和formid字段,无需单独追加行
        submission_df["createdOn"] = submission["submittedAt"]
        submission_df["formid"] = form_id
        # 将当前提交的DataFrame追加到总结果中
        form_submissions = pd.concat([form_submissions, submission_df], ignore_index=True)

# 过滤掉email为空的行
form_submissions = form_submissions.dropna(subset=["email"])

关键优化点

  • 移除了重复初始化form_submissions的操作,改为逐次追加每个表单的处理结果。
  • 每个提交数据直接关联对应的createdOn和formid,避免了填充空值的复杂逻辑,同时保证字段对应准确。
  • 使用pd.concat替代多次append,提升代码效率(append已被Pandas弃用)。

内容的提问来源于stack exchange,提问作者Vikas Bagur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:55:25