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

Python脚本重复运行时如何仅首次执行df_new创建代码并保留数据状态

问题描述

从网络获取数据生成df,执行代码:

df_new = df.drop(df.columns[[1, 2]],axis = 1)

创建df_new后,脚本需要每隔约1分钟重复运行,后续要通过增量添加新列来更新df_new。但每次重复运行时,df_new都会被重新创建,导致之前的操作丢失。需求是:

  • 仅在首次运行时执行df_new = df.drop(...)这行代码
  • 每隔1分钟更新df,并基于已有的df_new添加新列
解决方案

方法1:用全局变量标记首次运行

用全局变量记录初始化状态,每次运行时判断状态决定是否执行初始化:

# 全局标记,初始为False表示未完成初始化
is_first_run = True
df_new = None

def run_script():
    global is_first_run, df_new
    # 每次运行都从网络拉取最新df
    df = get_data_from_network()  # 替换成你的网络数据获取逻辑
    
    if is_first_run:
        # 首次运行才初始化df_new
        df_new = df.drop(df.columns[[1, 2]], axis=1)
        is_first_run = False
    else:
        # 非首次运行,基于新df给df_new增量添加列
        # 示例:替换成你的实际计算逻辑
        df_new['new_calculated_col'] = df['source_col'].apply(your_calculate_func)
    
    # 后续其他处理逻辑
    ...

# 定时循环运行
import time
while True:
    run_script()
    time.sleep(60)  # 间隔1分钟

方法2:用本地文件记录初始化状态

如果脚本可能被中断重启,全局变量会失效,可通过本地文件标记初始化状态:

import os
import time

# 标记文件,用来记录是否已初始化
INIT_MARK_FILE = '.df_init_flag'
df_new = None

def run_script():
    global df_new
    df = get_data_from_network()
    
    if not os.path.exists(INIT_MARK_FILE):
        # 首次运行:初始化df_new并创建标记文件
        df_new = df.drop(df.columns[[1, 2]], axis=1)
        with open(INIT_MARK_FILE, 'w') as f:
            f.write('initialized')
    else:
        # 非首次运行:增量更新df_new
        df_new['latest_data_col'] = df['fresh_data_col']
        ...
    
    # 后续处理逻辑
    ...

while True:
    run_script()
    time.sleep(60)

注:需要重置初始化状态时,手动删除.df_init_flag文件即可。

方法3:用类封装状态

若脚本逻辑复杂,用类维护df_new和运行状态会更清晰:

import time

class DataHandler:
    def __init__(self):
        self.initialized = False
        self.df_new = None
    
    def fetch_latest_df(self):
        # 封装网络获取数据的逻辑
        return get_data_from_network()
    
    def process_data(self):
        df = self.fetch_latest_df()
        
        if not self.initialized:
            self.df_new = df.drop(df.columns[[1, 2]], axis=1)
            self.initialized = True
        else:
            # 增量添加新列,示例用时间戳作为列名
            self.df_new[f'col_{int(time.time())}'] = df['target_col']
        
        # 后续处理逻辑
        ...

# 实例化并定时运行
handler = DataHandler()
while True:
    handler.process_data()
    time.sleep(60)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:33:28