Ссылка на локальную переменную в той же функции

#python-3.x #local-variables

Вопрос:

Я хочу объединить 2 кадра данных с помощью функции. Функция создает фрейм данных df1 при вызове с переменной «x=1», а затем другой, df2, при вызове с «x != 1», на основе оператора if в приведенном ниже фрагменте кода функции для большей ясности.

При достижении строки «df3 = pd.concat» я получаю сообщение об ошибке «UnboundLocalError: локальная переменная ‘df1’, на которую ссылались перед назначением«.

Я хотел бы понять, как добиться результата объединения df1 и df2 в df3.

 def Concat(url, x):
    if x == 1:
        df1 = pd.read_json(url)
    else:
        df2 = pd.read_json(url)
        df3 = pd.concat([df1, df2], ignore_index=True)


def main():
    Concat('*url*', 1)
    Concat('*url*', 2)
 

Комментарии:

1. В else блоке вы никогда не определяете df1 , поэтому вы получаете UnboundLocalError .

2. both df1 and df2 are generated вот тут ты ошибаешься. У вас есть код для создания обоих, но он никогда не будет работать вместе.

Ответ №1:

Вам следует немного подправить его, чтобы быть:

 def Concat(url, x):
    for i in x:
        if i == 1:
            df1 = pd.read_json(url)
        else:
            df2 = pd.read_json(url)
            df3 = pd.concat([df1, df2], ignore_index=True)


def main():
    Concat('*url*', [1, 2])
 

Комментарии:

1. Комментарии и ответ имеют смысл — я понимаю, почему я получаю ошибку. Просто чтобы убедиться, что я понимаю ответ, выполняется ли Конкат дважды из main (), один раз с x=1 и один раз с x=2?

2. @FlybatRamirez Нет, теперь это не так, он запускается один раз

3. Ах, я вижу, вы передаете список — мне и в голову не пришло это сделать. Довольно элегантно.

4. Я протестировал ваш код, однако я все еще получаю ту же ошибку = «UnboundLocalError: локальная переменная ‘df1’, на которую ссылались перед назначением». Оказывается, df1 вообще никогда не создается, поэтому x ==1 по какой-то причине никогда не бывает истинным.

5. @FlybatRamirez Ну, это, вероятно, проблема с вашим другим кодом, который вы нам не показали, а не с моим кодом…