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

如何基于两个条件将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)}条记录")

关键细节说明

  1. 持久化格式选择:用Pickle存储df2是因为它能保留DataFrame的所有数据类型(比如日期、分类类型),比CSV更可靠。如果需要可读性,也可以换成CSV,但要注意保存时加index=False避免存储冗余索引,读取时用pd.read_csv。
  2. 数据一致性检查:确保API返回的df1和已有的df2列名完全一致,否则pd.concat会产生缺失值。可以在追加前加个校验:
    assert set(df1.columns) == set(df2.columns), "df1和df2的列名不匹配,无法追加!"
    
  3. 去重处理:如果API可能返回重复数据(比如两次拉取有重叠记录),可以在追加后加上去重逻辑:
    # 替换"唯一标识列"为你数据中能区分唯一记录的列名
    df2 = df2.drop_duplicates(subset=["唯一标识列"], keep="last")
    
  4. 定时运行设置:每日两次运行脚本可以用系统定时任务实现:
    • Linux/macOS:用Cron,比如设置0 9,21 * * * python3 /path/to/your/script.py(每天9点和21点自动运行)
    • Windows:用「任务计划程序」创建定时任务,指定脚本路径和运行时间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:27:56