首页 > 解决方案 > 将数据从 python 数据框导出到 googlesheets

问题描述

我正在尝试将 python pandas 数据框导出到 google 工作表中,但出现在单元格中的值都以撇号 (') 开头。有没有办法让我格式化这些值,这样输出就会是一个正常的数字,而无需手动格式化谷歌表格上的数字?我正在使用 df2gspread 将我的数据上传到谷歌表格。我假设这是因为数字被读取为 str,但我对所有数值都做了 pd.to_numeric,所以我认为它会解决但没有。关于我应该如何处理/解决这个问题的任何想法?

import gspread
from df2gspread import df2gspread as d2g
from oauth2client.service_account import ServiceAccountCredentials
import pandas as pd
import numpy as np

scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']

#service_account from Google API.
credentials = ServiceAccountCredentials.from_json_keyfile_name(
         "service_account.json", scope)
gc = gspread.authorize(credentials)
wks = gc.open("Two").sheet1
data = wks.get_all_values()
headers = data.pop(0)
ssid = 'insert-ssid'
wks_name = 'Transform'
wks_name1 = 'Summary'
cell_of_start_df = 'B2'

pd.set_option('display.max_rows', 300)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

df = pd.DataFrame(data, columns=headers)
df2 = ...

d2g.upload(df,
    ssid,
    wks_name,
    credentials = credentials,
    col_names = True,
    row_names = True,
    start_cell = cell_of_start_df,
    clean = True)

d2g.upload(df2,
    ssid,
    wks_name1,
    credentials = credentials,
    col_names = True,
    row_names = True,
    start_cell = cell_of_start_df,
    clean = True)

我得到 AttributeError: 'str' object has no attribute 'values_update' 使用更新方法时

values = [df.columns.values.tolist()]
values.extend(df.values.tolist())
wks_name.values_update('Transform', params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})

values2 = [df2.columns.values.tolist()]
values2.extend(df2.values2.tolist())
wks_name1.values_update('Summary', params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})

我的错误发生在 wks_name.values_update 行中,说“str”没有属性“值更新”。我尝试过更改可能的变量,但似乎我遗漏了一些东西。

标签: pythonpandasdataframegoogle-sheets-apigspread

解决方案


修改点:

  • 在您的脚本中,似乎wks_namewks_name1是字符串值。我认为这是您的问题的原因。

  • 在gspread,似乎values_update是gspread.models.Spreadsheet类的方法。

  • 关于您的附加脚本,

      values = [df.columns.values.tolist()]
      values.extend(df.values.tolist())
      wks_name.values_update('Transform', params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})
    
      values2 = [df2.columns.values.tolist()]
      values2.extend(df2.values2.tolist())
      wks_name1.values_update('Summary', params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})
    
    • 我认为可以使用第一部分。但是关于第二部分,虽然我不确定 ,但df2我认为df2.values2.tolist(){'values': values}可能分别是df2.values.tolist(){'values': values2}

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

df = ...
df2 = ...

gc = gspread.authorize(credentials)
wks = gc.open("Two")

values = [df.columns.values.tolist()]
values.extend(df.values.tolist())
wks.values_update('Transform', params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})

values2 = [df2.columns.values.tolist()]
values2.extend(df2.values.tolist())
wks.values_update('Summary', params={'valueInputOption': 'USER_ENTERED'}, body={'values': values2})
  • 在这里,'valueInputOption': 'USER_ENTERED'被使用。

参考:


推荐阅读