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

使用函数向DataFrame添加记录时alldata每次循环后被清空,请求修复方案

问题原因

你遇到的问题核心是Python的参数传递逻辑:alldata作为参数传入myfunc时,函数内的outside_file只是它的一个引用,但当你执行outside_file = pd.concat([outside_file, newdata])时,你是创建了一个全新的DataFrame对象并赋值给了这个局部变量,和外部的alldata彻底断开了关联,所以外部的alldata一直是初始的空DataFrame。

修复方案

下面两种方法都能解决问题,按需选择:

方案一:使用全局变量(最简单直接)

在函数内部声明alldata为全局变量,让函数直接修改外部的这个DataFrame:

import schedule
import pandas as pd
import time  # 原代码遗漏了time模块,必须补上

alldata = pd.DataFrame()

def myfunc():
    global alldata  # 声明使用全局的alldata
    newdata = pd.DataFrame({'id':['A', 'c'],
                            'value': [20, 0]})
    print(newdata)
    alldata = pd.concat([alldata, newdata])
    print(alldata)
    
schedule.every().minute.at(':00').do(myfunc) 

while True:
    schedule.run_pending()
    print(alldata)
    time.sleep(30)

方案二:用可变容器包裹(避免全局变量)

利用列表的可变性,把DataFrame放在列表里,函数修改列表内部的元素,这样外部的容器会同步更新:

import schedule
import pandas as pd
import time

# 用列表包裹空DataFrame,列表是可变对象
alldata_container = [pd.DataFrame()]

def myfunc(container):
    newdata = pd.DataFrame({'id':['A', 'c'],
                            'value': [20, 0]})
    print(newdata)
    # 直接替换列表里的第一个元素为拼接后的新DataFrame
    container[0] = pd.concat([container[0], newdata])
    print(container[0])
    
schedule.every().minute.at(':00').do(myfunc, alldata_container) 

while True:
    schedule.run_pending()
    print(alldata_container[0])  # 打印容器内的DataFrame
    time.sleep(30)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:54:52