глобальная переменная и ссылка перед присваиванием - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать пустой глобальный кадр данных pandas, а затем добавить его в функции обработки данных.У меня проблемы с выяснением, что происходит не так.Вот минимальный пример:

from datetime import datetime
import pandas as pd

def do_stuff_and_append_df():
    dt = datetime.now()
    row = dict.fromkeys(df.columns.tolist())
    row['datetime'] = dt
    row['pduType'] = 'blah'
    df = df.append(row, ignore_index=True)
    print(df.head())

def main():
    # empty dataframe for appending
    header = ['datetime', 'pduType']
    global df 
    df = pd.DataFrame(columns=header)
    # Main loop
    try:
        while True:
            do_stuff_and_append_df()

    except KeyboardInterrupt:
        print('\nSaving and exiting.')
        df.to_csv('data.csv')

main()

Я получаю ошибку UnboundLocalError: local variable 'df' referenced before assignment.Кто-нибудь знает, почему я не могу вызвать df в этой функции?

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Если вы хотите использовать глобальную переменную, укажите ее явно в глобальной области видимости:

from datetime import datetime
import pandas as pd

def do_stuff_and_append_df():
    dt = datetime.now()
    row = dict.fromkeys(df.columns.tolist())
    row['datetime'] = dt
    row['pduType'] = 'blah'
    df = df.append(row, ignore_index=True)
    print(df.head())

def main():
    # Main loop
    try:
        while True:
            do_stuff_and_append_df()

    except KeyboardInterrupt:
        print('\nSaving and exiting.')
        df.to_csv('data.csv')

if __name__ == "__main__":
    header = ['datetime', 'pduType']
    df = pd.DataFrame(columns=header)

Либо так, либо посмотрите ответ Чепнера.Желательно, чтобы вы не использовали глобальные переменные

0 голосов
/ 18 сентября 2018

попробуйте добавить глобальное объявление в do_stuff_and_append_df

def do_stuff_and_append_df():
    global df
0 голосов
/ 18 сентября 2018

Еще лучше, не использовать глобальную переменную .Передайте требуемый фрейм данных в качестве аргумента.

from datetime import datetime
import pandas as pd

def do_stuff_and_append_df(df):
    dt = datetime.now()
    row = dict.fromkeys(df.columns.tolist())
    row['datetime'] = dt
    row['pduType'] = 'blah'
    df = df.append(row, ignore_index=True)
    print(df.head())
    return df

def main():
    # empty dataframe for appending
    header = ['datetime', 'pduType']
    df = pd.DataFrame(columns=header)
    # Main loop
    try:
        while True:
            df = do_stuff_and_append_df(df)

    except KeyboardInterrupt:
        print('\nSaving and exiting.')
        df.to_csv('data.csv')

main()
0 голосов
/ 18 сентября 2018

Вам также необходимо объявить "global df" в функции do_stuff_and_append_df ().

Поскольку функция do_stuff_and_append_df () не знает, ссылаетесь ли вы на локальную или глобальную переменную.

...