#python #pandas #function #dataframe #global-variables
#python #pandas #функция #dataframe #глобальные переменные
Вопрос:
Я создал пару функций, которые загружают dataset с github, а затем объединяют его. Эта часть кода работает правильно. Моя проблема возникает, когда я запускаю функцию объединения во второй раз.
Что я пробовал при тестировании, работают ли мои функции так, как задумано.
loadDataset("https://raw.githubusercontent.com/AAF108/ml/master/test3")
print (dataset)
combine({"data": [{"room_temperature": 20, "light_intensity":
511,"humidity": 50}]})
print(combinedData)
URL-адрес в loadDataset такой:
{"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 не обновляются.
Комментарии:
1. Похоже, что он обновляется, просто не так часто, как вы ожидаете. Вы вызывали
print(combinedData)
дважды и получили более длительный результат во второмcombine
функцию.2. @Kevin но если бы это работало правильно, разве я не получил бы 3 строки, поскольку я дважды объединяю их в свой исходный фрейм данных с 1 строкой?
3. Я думаю, вы можете захотеть проверить содержимое
df1
иdf2
с помощью 2combine
функции.4. @A0sXc950 вы запускаете свой код как скрипт или в записной книжке Jupyter?
5. @A0sXc950 по этой причине вам на самом деле не нужна глобальная переменная (на мой взгляд, старайтесь избегать глобальных переменных, насколько это возможно). Просто удалите
global combinedData
, добавьтеreturn combinedData
в своюcombine
функцию. И в вашем основном скрипте используйтеcombinedData = combine(...)
вместоcombine(...)
. В другой функции, которая нуждаетсяcombinedData
, просто передайте свой globalcombinedData
этой функции в качестве параметра.
Ответ №1:
Это не так 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 notebook, то это не произойдет.
Комментарии:
1.
global combinedData
позволяет вам повторно присвоить новое значение глобальнымcombinedData
, и это видно в глобальной области видимости. Я только что создал простой скрипт для проверки этого.2. теперь, когда я пытаюсь напечатать combinedData, я получаю пустые фреймы данных. Я пытаюсь неправильно напечатать глобальные переменные?
3. @A0sXc950 На самом деле, я допустил ошибку; это тоже не сработало бы.
4. @Kevin По-видимому,
global
в записной книжке Jupyter notebook ведет себя иначе, чем в скрипте. Я обновил свой ответ, чтобы отразить это. Спасибо за предупреждение!