如何基于两个条件将API获取的DataFrame数据追加到空DataFrame?
嗨,我来帮你搞定这个DataFrame数据累积的需求!根据你的描述,核心是要区分首次运行和后续运行的逻辑,同时确保每日两次拉取的API数据都能正确追加到df2里。下面是具体的实现方案:
核心思路
我们需要处理两个关键场景:
- 首次运行:此时还没有df2的历史数据,直接把API返回的df1作为初始的df2
- 后续运行:把新拉取的df1数据追加到已有的df2中
另外,因为脚本是每日独立运行两次的,必须把df2持久化存储到本地文件,否则每次运行都会重新创建空的df2,之前累积的数据就丢失了。
完整代码实现
下面是用Pandas实现的完整示例,包含API数据拉取、df2的判断与更新、持久化存储:
import pandas as pd import os # 替换成你的API调用函数,返回当日拉取的df1 def fetch_api_data(): # 这里写你的API请求逻辑,比如用requests获取数据后转成DataFrame # 示例:df1 = pd.DataFrame(requests.get("你的API地址").json()) df1 = pd.DataFrame(...) return df1 # 定义df2的持久化路径,用pickle格式能完整保留DataFrame的结构和数据类型 df2_save_path = "accumulated_data.pkl" # 拉取当日API数据 df1 = fetch_api_data() # 判断是否是首次运行 if os.path.exists(df2_save_path): # 读取已有的累积数据df2 df2 = pd.read_pickle(df2_save_path) # 追加新数据,ignore_index=True重置索引避免重复 df2 = pd.concat([df2, df1], ignore_index=True) else: # 首次运行,直接把df1作为初始的df2 df2 = df1.copy() # 保存更新后的df2,供下次运行使用 df2.to_pickle(df2_save_path) # 可选:打印更新结果,方便验证 print(f"数据更新完成!当前df2共有{len(df2)}条记录")
关键细节说明
- 持久化格式选择:用Pickle存储df2是因为它能保留DataFrame的所有数据类型(比如日期、分类类型),比CSV更可靠。如果需要可读性,也可以换成CSV,但要注意保存时加
index=False避免存储冗余索引,读取时用pd.read_csv。 - 数据一致性检查:确保API返回的df1和已有的df2列名完全一致,否则
pd.concat会产生缺失值。可以在追加前加个校验:assert set(df1.columns) == set(df2.columns), "df1和df2的列名不匹配,无法追加!" - 去重处理:如果API可能返回重复数据(比如两次拉取有重叠记录),可以在追加后加上去重逻辑:
# 替换"唯一标识列"为你数据中能区分唯一记录的列名 df2 = df2.drop_duplicates(subset=["唯一标识列"], keep="last") - 定时运行设置:每日两次运行脚本可以用系统定时任务实现:
- Linux/macOS:用Cron,比如设置
0 9,21 * * * python3 /path/to/your/script.py(每天9点和21点自动运行) - Windows:用「任务计划程序」创建定时任务,指定脚本路径和运行时间
- Linux/macOS:用Cron,比如设置
内容的提问来源于stack exchange,提问作者RustyShackleford
相关产品推荐
相关产品推荐

