#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)