我创建了几个函数,这些函数从github加载数据集,然后将其组合。这部分代码正常工作。当我第二次运行Combine函数时,出现了我的问题。
在测试我的功能是否按预期工作时尝试的操作。
loadDataset("https://raw.githubusercontent.com/AAF108/ml/master/test3")
print (dataset)
combine({"data": [{"room_temperature": 20, "light_intensity":
511,"humidity": 50}]})
print(combinedData)
loadDataset中的URL是这样:
{"data": [{"room_temperature": 20, "light_intensity": 511,"humidity": 50}]}
运行此部分时,我得到了(这是我期望得到的):
humidity light_intensity room_temperature
0 50 511 20
humidity light_intensity room_temperature
0 50 511 20
0 50 511 20
下面是我做的功能的代码:
def loadDataset(url):
global dataset
dataset = pd.read_json(url)
def combine(obj):
global combinedData
json= obj
df1 = pd.DataFrame(dataset)
df2 = pd.DataFrame(json["data"])
combinedData = pd.concat([df1, df2])
这样做会引起我的问题:
loadDataset("https://raw.githubusercontent.com/AAF108/ml/master/test3")
print (dataset)
combine({"data": [{"room_temperature": 20, "light_intensity":
511,"humidity": 50}]})
print(combinedData)
combine({"data": [{"room_temperature": 20, "light_intensity":
511,"humidity": 50}]})
print(combinedData)
我期望什么:
humidity light_intensity room_temperature
0 50 511 20
humidity light_intensity room_temperature
0 50 511 20
0 50 511 20
0 50 511 20
我得到的是:
humidity light_intensity room_temperature
0 50 511 20
humidity light_intensity room_temperature
0 50 511 20
0 50 511 20
我不确定我的CombineData为什么不更新。
答案 0 :(得分:1)
global
的工作方式不是这样。而是将名称 combinedData
作为引用全局定义对象的局部变量“导入”到您的函数中。
因此,因此,当您运行 combinedData = pd.concat([df1, df2])
时,会将pd.concat([df1, df2])
的结果分配给 local 变量combinedData
。这种变化显然在全球范围内是不可见的。
您应避免以这种方式使用全局变量,而应将对象作为参数传递。
如果您确实要这样做,尽管...您可以做类似的事情(编辑:这实际上是行不通的,因为pd.append
不能就地工作):
combinedData = pd.DataFrame()
def combine(obj):
global combinedData
json = obj
df1 = pd.DataFrame(dataset)
df2 = pd.DataFrame(json["data"])
combinedData.append(pd.concat([df1, df2]))
感谢发表评论,我进行了更多测试,发现 real 原因是OP的代码无法正常运行:运行时环境。
如果您以 script 身份运行此代码,则它会修改全局变量combinedData
。但是,如果您在 Jupyter笔记本中运行它,则不会。