基于JSON创建Pandas DataFrame时formid赋值不符合预期问题排查
问题排查与修复
问题根源
你的代码存在三个核心逻辑错误,导致所有行的formid值相同:
- 重复初始化DataFrame:外层循环每次都执行
form_submissions = pd.DataFrame(),第一次表单的处理结果会被第二次循环完全覆盖,最终只保留最后一次循环的处理结果。 - 数据重复追加:
submissions.extend(r_json_online["results"])在每次外层循环都追加同一个数据集,导致submissions里包含重复的提交数据,且最终所有数据都使用最后一次循环的formid[i]。 - 字段添加逻辑混乱:通过单独追加
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
相关产品推荐
相关产品推荐

