【问题标题】:Exporting data from python dataframe to googlesheets将数据从 python 数据框导出到谷歌表格
【发布时间】:2020-10-30 19:01:48
【问题描述】:

我正在尝试将 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”没有属性“值更新”。我已尝试更改可能的变量,但似乎我遗漏了一些东西。

【问题讨论】:

  • 我认为您的问题可能与this thread 有关。这个怎么样?
  • 我尝试了该线程的一些变体,但我一直遇到一个问题,它会说 '____' 没有属性到 '____'。我的新尝试看起来像。 gc = gspread.authorize(credentials) wks = gc.open("Project").sheet1 data = wks.get_all_values() ssid = 'insert sheet id' wks_name = 'Transform' values = [df.columns.values.tolist()] values.extend(df.values.tolist()) wks_name.values_update('Transform', params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})
  • 感谢您的回复。我有 2 个问题要您回复。 1、I keep getting an issue where it would say '____' has no attribute to '____'.的错误出现在哪里? 2. 把脚本放到评论里,我觉得可读性变低了。那么你可以在你的问题中添加脚本吗?
  • 当然,这几乎是我正在使用的主要导入/导出功能。错误发生在 wks_name.values_update 部分。
  • 感谢您的回复。根据您的回复,我发布了一个修改后的脚本作为答案。你能确认一下吗?

标签: python pandas dataframe google-sheets-api gspread


【解决方案1】:

修改点:

  • 在您的脚本中,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'

参考资料:

【讨论】:

  • 我在使用这种方法时遇到了问题。这仅在dtypes都相同的情况下才有效吗?一些在上传方法中运行良好的变量突然引发错误。
  • @DayLy 感谢您的回复。我带来的不便表示歉意。不幸的是,我无法复制您的情况。因为当我测试修改后的脚本时,我可以确认该脚本有效。这是因为我的技术不好。我对此深表歉意。为了正确理解您的问题,您能否提供复制问题的脚本?借此,我想确认一下。当你能合作解决你的问题时,我很高兴。如果可以,请将其添加到您的问题中。你能合作解决你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 2014-05-17
  • 2014-07-11
相关资源
最近更新 更多