使用函数向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
相关产品推荐
相关产品推荐

