Как сохранить результаты цикла в одном (1) кадре данных?

#python #dataframe #loops #google-sheets

Вопрос:

У меня есть код на python, который выполняет цикл между различными «базами данных» и хранит каждую базу данных отдельно. Как сохранить содержимое из десяти (10) циклов в один daataframe, который я могу сохранить / экспортировать или отправить в Google Листы?

Вот предварительный просмотр моего кода ниже:

 USERNAME = 'email'
PASSWORD = 'password'
DATABASES = [ 'DB1', 'DB2', 'DB3', 'DB4', 'DB5', 'DB6', 'DB7', 'DB8', 'DB9', 'DB10' ]

def get_dataframe(db):
    client = my.API(username=USERNAME, password=PASSWORD, database=db)
    client.authenticate()

    device_status = client.get("DeviceStatusInfo")
    device_serial = client.get("Device")


    df = pandas.DataFrame(device_serial)
    ids = list(df['id'])
    sn = list(df['serialNumber'])
    nm = list(df['name'])
    cm = list(df['comment'])
    dt = list(df['deviceType'])

    di = pandas.DataFrame(device_status)
    device_ids = di['device']

    dev_id = []
    for device_id in device_ids:
        dev_id.append(device_id['id'])

    di['id'] = pandas.Series(dev_id)

    d = {
        'id':ids,
        'serialNumber':sn,
        'name':nm,
        'comment':cm,
        'deviceType':dt
    }


    df2 = pandas.DataFrame(d)
    dfo = pandas.merge(di, df2, on='id')

    print(dfo)

    return dfo
 

Кроме того, вот цикл ниже:

 def main():

    for db in DATABASES:
        df = get_dataframe(db)

        gc = gspread.service_account(filename='creds.json')
        sh = gc.open_by_key('1vToay2IueDcV0gzu6MCehcMUU6Frea1fa3lqjpoKdSs')
        worksheet = sh.get_worksheet(0)

        dfo = pandas.DataFrame(df)
        set_with_dataframe(worksheet, dfo)

if __name__ == '__main__':
    main()
 

Любая помощь от кого угодно будет очень признательна! Заранее спасибо!

Ответ №1:

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

 def main():
final_df=pandasd.DataFrame(columns=['your column names'])
for db in DATABASES:
    df = get_dataframe(db)
    final_df=pandas.concat([df,final_df])

gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1vToay2IueDcV0gzu6MCehcMUU6Frea1fa3lqjpoKdSs')
worksheet = sh.get_worksheet(0)
set_with_dataframe(worksheet, final_df)


if __name__ == '__main__':
    main()
 

P. S: этот метод медленный ,и лучшим способом всегда было бы хранить ваши базы данных в виде массивов numpy и создавать фрейм данных только после циклов, так как работа с фреймом данных pandas выполняется медленно.

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

1. Спасибо! Я заставил его работать, используя следующий метод объединения: def main(): dfo = pd.concat([get_dataframe(db) для базы данных в базах данных]) gc = gspread.service_account(имя файла=’creds.json’) sh = gc.open_by_key(‘1vToay2IueDcV0gzu6MCehcMUU6Frea1fa3lqjpoKdSs’) рабочий лист = sh.get_worksheet(0) set_with_dataframe(рабочий лист, dfo)