我创建了一些函数,从github加载数据集然后将它组合起来。这部分代码正常工作。当我第二次运行组合功能时,我的问题出现了。
在测试我的功能是否按预期工作时我尝试了什么。
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没有更新。
这不是global
的工作方式。相反,它将名称combinedData
“导入”到您的函数中,作为引用全局定义对象的局部变量。
因此,当你运行combinedData = pd.concat([df1, df2])
时,你将pd.concat([df1, df2])
的结果赋给局部变量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]))
感谢评论,我做了一些测试,我发现OP的代码不起作用的真正原因是:运行时环境。
如果您将此代码作为脚本运行,那么它会修改全局变量combinedData
。但是,如果您在Jupyter笔记本中运行它,那么它不会。