将 pandas 数据框附加到 Google 电子表格
Appending pandas Data Frame to Google spreadsheet
案例:
我的脚本 returns 需要将数据框作为 data.As 的新行附加到现有 google 电子表格,现在,我通过 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)
有没有办法附加整个数据框而不是多个单行?
如果 Google 电子表格采用 .csv 格式,那么您可以使用 df.to_csv() 将 pandas 数据帧转换为 csv 并将其保存为该格式
我可以推荐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)
我想到了以下解决方案。它不会覆盖当前数据,而只是将整个 pandas DataFrame df
附加到电子表格中名称为 sheet
的 Sheet 的末尾,名称为 spread_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 Sheets 后才有效。
这是要写入、追加(不将现有的 sheet 加载到内存中)并读取到 google sheets.
的代码
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')
- 写入模式:首先清除现有工作sheet =>
ws.clear()
.第二次使用 set_with_dataframe()
上传数据框,
这里注意resize=True
,它严格地将worksheet中的行和列设置为df.shape。这将有助于稍后的 append 方法。
- 追加模式:首先,根据dataframe添加行。第二次设置参数
resize=False
,因为我们正在添加行,row=ws.row_count+1
锚定其行值以进行追加。
- 读取模式(默认):returns一个数据帧
ws = gc.open("sheet title").worksheet("Sheet1")
gd.set_with_dataframe(ws, dataframe)
#简单地将你的数据帧转换为 google sheet
我遇到了同样的问题,这是我所做的
将数据帧转换为列表并使用 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)
以下方法,使用gspread
,可能有助于理解程序和解决问题
在您的环境中安装库。
在脚本中导入库
import pandas as pd
import gspread
from gspread_dataframe import set_with_dataframe
在 Google API console 中创建凭据。
将以下内容添加到脚本中,以访问 Google Sheet
gc = gspread.service_account(filename='GoogleAPICredentials.json')
sh = gc.open_by_key('GoogleSheetID')
假设要添加到第一个 sheet,在 get_worksheet
中使用 0
(第二个 sheet 使用 1,依此类推)
worksheet = sh.get_worksheet(0)
然后,为了导出dataframe,考虑到dataframe的名字是df
,到Google Sheet
set_with_dataframe(worksheet, df)
以下不需要 gspread 以外的外部库:
worksheet.update([dataframe.columns.values.tolist()] + dataframe.values.tolist())
案例: 我的脚本 returns 需要将数据框作为 data.As 的新行附加到现有 google 电子表格,现在,我通过 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)
有没有办法附加整个数据框而不是多个单行?
如果 Google 电子表格采用 .csv 格式,那么您可以使用 df.to_csv() 将 pandas 数据帧转换为 csv 并将其保存为该格式
我可以推荐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)
我想到了以下解决方案。它不会覆盖当前数据,而只是将整个 pandas DataFrame df
附加到电子表格中名称为 sheet
的 Sheet 的末尾,名称为 spread_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 Sheets 后才有效。
这是要写入、追加(不将现有的 sheet 加载到内存中)并读取到 google sheets.
的代码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')
- 写入模式:首先清除现有工作sheet =>
ws.clear()
.第二次使用set_with_dataframe()
上传数据框, 这里注意resize=True
,它严格地将worksheet中的行和列设置为df.shape。这将有助于稍后的 append 方法。 - 追加模式:首先,根据dataframe添加行。第二次设置参数
resize=False
,因为我们正在添加行,row=ws.row_count+1
锚定其行值以进行追加。 - 读取模式(默认):returns一个数据帧
ws = gc.open("sheet title").worksheet("Sheet1")
gd.set_with_dataframe(ws, dataframe)
#简单地将你的数据帧转换为 google sheet
我遇到了同样的问题,这是我所做的
将数据帧转换为列表并使用 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)
以下方法,使用gspread
,可能有助于理解程序和解决问题
在您的环境中安装库。
在脚本中导入库
import pandas as pd import gspread from gspread_dataframe import set_with_dataframe
在 Google API console 中创建凭据。
将以下内容添加到脚本中,以访问 Google Sheet
gc = gspread.service_account(filename='GoogleAPICredentials.json') sh = gc.open_by_key('GoogleSheetID')
假设要添加到第一个 sheet,在 get_worksheet
中使用 0
(第二个 sheet 使用 1,依此类推)
worksheet = sh.get_worksheet(0)
然后,为了导出dataframe,考虑到dataframe的名字是
df
,到Google Sheetset_with_dataframe(worksheet, df)
以下不需要 gspread 以外的外部库:
worksheet.update([dataframe.columns.values.tolist()] + dataframe.values.tolist())