【问题标题】:Appending pandas Data Frame to Google spreadsheet将熊猫数据框附加到 Google 电子表格
【发布时间】:2017-08-07 06:45:26
【问题描述】:

案例: 我的脚本返回一个数据框,该数据框必须作为新的数据行附加到现有的谷歌电子表格中。截至目前,我正在通过 gspread 将数据框作为多个单行附加。

我的代码:

import gspread
import pandas as pd
df = pd.DataFrame()

# After some processing a non-empty data frame has been created.

output_conn = gc.open("SheetName").worksheet("xyz")

# Here 'SheetName' is google spreadsheet and 'xyz' is sheet in the workbook

for i, row in df.iterrows():
    output_conn.append_row(row)

有没有办法追加整个数据框而不是多个单行?

【问题讨论】:

    标签: python pandas dataframe google-sheets gspread


    【解决方案1】:

    我可以推荐gspread-dataframe

    import gspread_dataframe as gd
    
    # Connecting with `gspread` here
    
    ws = gc.open("SheetName").worksheet("xyz")
    existing = gd.get_as_dataframe(ws)
    updated = existing.append(your_new_data)
    gd.set_with_dataframe(ws, updated)
    

    【讨论】:

    • 这是否也覆盖了“现有”数据,如果我们要向 1000 行表中添加 5 个新行等情况,这是否会让人不知所措?
    • 是的,这种方法将现有的 google sheet 数据加载到您的本地计算机,附加到本地,最后将整个 shebang 写回您的 google sheet。 It looks like 你可以使用row 参数附加到set_with_dataframe,但是你最好相信你的列顺序:-)
    • 我找到了更好的解决方案 - 使用 gspread 包中的 values_append。这会在一次调用中附加值,而无需替换工作表中的当前数据。
    • @DarkTemplar 听起来很酷!如果你可以花时间,请添加一个独立的答案,它可以成为常识:-)
    【解决方案2】:

    这是编写、附加(不将现有工作表加载到内存中)和读取到谷歌工作表的代码。

    import gspread_dataframe as gd
    import gspread as gs
    gc = gs.service_account(filename="your/cred/file.json")
    
    def export_to_sheets(worksheet_name,df,mode='r'):
        ws = gc.open("SHEET_NAME").worksheet("worksheet_name")
        if(mode=='w'):
            ws.clear()
            gd.set_with_dataframe(worksheet=ws,dataframe=df,include_index=False,include_column_header=True,resize=True)
            return True
        elif(mode=='a'):
            ws.add_rows(df.shape[0])
            gd.set_with_dataframe(worksheet=ws,dataframe=df,include_index=False,include_column_header=False,row=ws.row_count+1,resize=False)
            return True
        else:
            return gd.get_as_dataframe(worksheet=ws)
        
    df = pd.DataFrame.from_records([{'a': i, 'b': i * 2} for i in range(100)])
    export_to_sheets("SHEET_NAME",df,'a')
    

    1. 写入模式:首先清除现有工作表 => ws.clear() .第二次使用set_with_dataframe()上传数据框, 这里注意resize=True,它将工作表中的行和列严格设置为df.shape。这将在后面的 append 方法中有所帮助。
    2. 追加模式:首先根据数据框添加行。第二次设置参数resize=False,因为我们正在添加行,row=ws.row_count+1 锚定其行值以进行追加。
    3. 读取模式(默认):返回一个数据帧

    【讨论】:

    • 有趣的分享:有这个包github.com/betodealmeida/shillelagh,它为Google Sheets提供了一个SQL接口。我们可以直接从 Google 表格中插入、更新、选择行。
    • 嘿 Darsh 我试过你的代码,但是在append mode 期间它总是返回一个错误你碰巧知道为什么吗?:gspread.exceptions.APIError: {'code': 400, 'message': 'Range (test!A999:B1001) exceeds grid limits. Max rows: 998, max columns: 26', 'status': 'INVALID_ARGUMENT'}
    • 做了一些测试,发现row_count 也返回空行。这会导致异常。我建议使用max_rows = len(sheet.get_all_values(major_dimension='rows')) 而不是row=ws.row_count 来调整代码。这样数据将附加在非空白单元格的末尾
    【解决方案3】:

    我想出了以下解决方案。它不会覆盖当前数据,而只是将整个 pandas DataFrame df 附加到名为 spread_sheet 的电子表格中名为 sheet 的工作表的末尾。

    import gspread
    from google.auth.transport.requests import AuthorizedSession
    from oauth2client.service_account import ServiceAccountCredentials
    
    def append_df_to_gs(df, spread_sheet:str, sheet_name:str):
        scopes = [
            'https://spreadsheets.google.com/feeds',
            'https://www.googleapis.com/auth/drive',
        ]
        credentials = ServiceAccountCredentials.from_json_keyfile_name(
            path_to_credentials,
            scopes=scopes
        )
        gsc = gspread.authorize(credentials)
        sheet = gsc.open(spread_sheet)
        params = {'valueInputOption': 'USER_ENTERED'}
        body = {'values': df.values.tolist()}
        sheet.values_append(f'{sheet_name:str}!A1:G1', params, body)
    

    有关参数valueInputOption,请咨询this。我在这里使用了USER_ENTERED,因为一旦我将数据附加到 Google 表格,我需要一些公式才能生效。

    【讨论】:

      【解决方案4】:

      以下方法,使用gspread,可能有助于理解程序并解决问题

      1. 在您的环境中安装库。

      2. 在脚本中导入库

        import pandas as pd
        import gspread
        from gspread_dataframe import set_with_dataframe
        
      3. Google API console 中创建凭据。

      4. 将以下内容添加到脚本中,以访问 Google 表格

        gc = gspread.service_account(filename='GoogleAPICredentials.json')
        sh = gc.open_by_key('GoogleSheetID')
        

      假设要添加到第一个工作表,请在 get_worksheet 中使用 0(第二个工作表使用 1,依此类推)

      worksheet = sh.get_worksheet(0)
      
      1. 然后,为了导出数据框,考虑到数据框名称是df,到 Google 表格

        set_with_dataframe(worksheet, df)
        

      【讨论】:

        【解决方案5】:
        ws = gc.open("sheet title").worksheet("Sheet1")
        
        gd.set_with_dataframe(ws, dataframe)
        

        #simply 将您的数据框转换为谷歌表格

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题,这就是我所做的 将数据框转换为列表并使用gspread的append_rows()

              gc = gspread.service_account(filename="credentials.json")
              sh = gc.open_by_key('<your_key>')
              ws = sh.sheet1
              
              ##data is the original data frame
              data_list = data.values.tolist()
              
              ws.append_rows(data_list)
          

          【讨论】:

            【解决方案7】:

            如果 Google 电子表格采用 .csv 格式,那么您可以使用 df.to_csv() 将 pandas 数据帧转换为 csv 并以该格式保存

            【讨论】:

              猜你喜欢
              • 2014-07-11
              • 1970-01-01
              • 2018-02-08
              • 2017-06-13
              • 2014-01-03
              • 1970-01-01
              • 2019-01-14
              • 1970-01-01
              • 2019-10-22
              相关资源
              最近更新 更多