首页 > 解决方案 > 如何将循环结果存储到一 (1) 个数据帧中?

问题描述

我有一些 python 代码在不同的“数据库”中运行一个循环并分别存储每个数据库。如何将十 (10) 个循环中的内容保存到一个可以保存/导出或推送到 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()

任何人的帮助将不胜感激!提前致谢!

标签: pythondataframeloopsgoogle-sheets

解决方案


我不确定我是否完全理解您的问题,我仍然无法添加评论,但您是否尝试过在循环之外创建一个空数据框,然后使用 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()

PS:这种方法很慢,更好的方法是始终将数据库存储为 numpy 数组,并且仅在循环之后创建数据框,因为使用 pandas 数据框很慢。


推荐阅读