将 Google 电子表格 CSV 引入熊猫数据框架

我上传了一个文件到谷歌电子表格(使一个公开的例子 IPython 笔记本电脑,与数据)我使用的文件在它的本地形式可以读入熊猫数据框架。所以现在我使用下面的代码来读取电子表格,工作良好,但只是以字符串的形式输入,我没有任何运气试图把它放回到一个数据框架(你可以得到数据)

import requests
r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv')
data = r.content

数据最终看起来像: (第一行标题)

',City,region,Res_Comm,mkt_type,Quradate,National_exp,Alabama_exp,Sales_exp,Inventory_exp,Price_exp,Credit_exp\n0,Dothan,South_Central-Montgomery-Auburn-Wiregrass-Dothan,Residential,Rural,1/15/2010,2,2,3,2,3,3\n10,Foley,South_Mobile-Baldwin,Residential,Suburban_Urban,1/15/2010,4,4,4,4,4,3\n12,Birmingham,North_Central-Birmingham-Tuscaloosa-Anniston,Commercial,Suburban_Urban,1/15/2010,2,2,3,2,2,3\n

带入磁盘驻留文件的本地熊猫代码如下:

df = pd.io.parsers.read_csv('/home/tom/Dropbox/Projects/annonallanswerswithmaster1012013.csv',index_col=0,parse_dates=['Quradate'])

一个“干净”的解决方案将有助于许多提供一个简单的方式共享熊猫使用数据集!我尝试了很多替代方案,但都没有成功,我很确定我又错过了一些显而易见的东西。

更新注释新的 Google 电子表格有一个不同的 URL 模式只要用这个来代替上面例子中的 URL,或者用下面的答案,你应该就没问题了,这里有一个例子:

https://docs.google.com/spreadsheets/d/177_dFZ0i-duGxLiyg6tnwNDKruAYE-_Dd8vAQziipJQ/export?format=csv&id

参见下面@Max Ghenis 的解决方案,它刚刚使用了 pd.read _ csv,不需要 StringIO 或请求..。

67416 次浏览

你可以在 StringIO对象上使用 read_csv():

from io import BytesIO


import requests
import pandas as pd


r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv')
data = r.content
    

In [10]: df = pd.read_csv(BytesIO(data), index_col=0,parse_dates=['Quradate'])


In [11]: df.head()
Out[11]:
City                                            region     Res_Comm  \
0       Dothan  South_Central-Montgomery-Auburn-Wiregrass-Dothan  Residential
10       Foley                              South_Mobile-Baldwin  Residential
12  Birmingham      North_Central-Birmingham-Tuscaloosa-Anniston   Commercial
38       Brent      North_Central-Birmingham-Tuscaloosa-Anniston  Residential
44      Athens                 North_Huntsville-Decatur-Florence  Residential


mkt_type            Quradate  National_exp  Alabama_exp  Sales_exp  \
0            Rural 2010-01-15 00:00:00             2            2          3
10  Suburban_Urban 2010-01-15 00:00:00             4            4          4
12  Suburban_Urban 2010-01-15 00:00:00             2            2          3
38           Rural 2010-01-15 00:00:00             3            3          3
44  Suburban_Urban 2010-01-15 00:00:00             4            5          4


Inventory_exp  Price_exp  Credit_exp
0               2          3           3
10              4          4           3
12              2          2           3
38              3          3           2
44              4          4           4

看来没有 StringIO对我很有用:

test = pd.read_csv('https://docs.google.com/spreadsheets/d/' +
'0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc' +
'/export?gid=0&format=csv',
# Set first column as rownames in data frame
index_col=0,
# Parse column values to datetime
parse_dates=['Quradate']
)
test.head(5)  # Same result as @TomAugspurger

顺便说一下,包括 ?gid=在内,可以导入不同的工作表,在 URL 中找到 gid。

我的方法有点不同。我刚用了熊猫。Dataframe () ,但显然需要安装和导入 gspan。而且效果很好!

gsheet = gs.open("Name")
Sheet_name ="today"
wsheet = gsheet.worksheet(Sheet_name)
dataframe = pd.DataFrame(wsheet.get_all_records())

我一直在使用下面的工具,到目前为止,它工作:

def load_from_gspreadsheet(sheet_name, key):
url = 'https://docs.google.com/spreadsheets/d/{key}/gviz/tq?tqx=out:csv&sheet={sheet_name}&headers=1'.format(
key=key, sheet_name=sheet_name.replace(' ', '%20'))


log.info('Loading google spreadsheet from {}'.format(url))


df = pd.read_csv(url)
return df.drop([col for col in df.columns if col.startswith('Unnamed')], axis=1)

必须指定 sheet _ name 和密钥。键是从以下路径中的 url 获得的字符串: https://docs.google.com/spreadsheets/d/{key}/edit/

如果列名有多行,可以更改标题的值,但我不确定它是否仍然适用于多标题。

如果谷歌改变他们的 API,它可能会刹车。

还请记住,您的电子表格必须是公开的,每个人都有链接可以阅读它。

如果 csv 文件是通过驱动器共享的,而不是通过电子表格,那么下面的网址更改将工作

#Derive the id from the google drive shareable link.
#For the file at hand the link is as below
#<https://drive.google.com/open?id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69>
file_id='1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
link='https://drive.google.com/uc?export=download&id={FILE_ID}'
csv_url=link.format(FILE_ID=file_id)
#The final url would be as below:-
#csv_url='https://drive.google.com/uc?export=download&id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
df = pd.read_csv(csv_url)

数据框架将是(如果您只运行上面的代码)

    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9   10  11
3   12  13  14  15

见工作代码 给你

在浏览器中打开所需的特定工作表。确保它至少可以被任何有链接的人看到。复制并粘贴 URL。你会得到类似 https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER的东西。

sheet_url = 'https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER'

首先,我们将其转换为 CSV 导出 URL,如 https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/export?format=csv&gid=NUMBER:

csv_export_url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')

然后我们将其传递给 Read _ csv,它可以采用 URL。

df = pd.read_csv(csv_export_url)

如果谷歌改变它的 API (似乎没有文档记录) ,这将会中断,并且如果发生网络故障,可能会出现无益的错误。

这对我有用。

import pandas as pd


#Create a public URL
#https://docs.google.com/spreadsheets/d/0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc/edit?usp=sharing


#get spreadsheets key from url
gsheetkey = "0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc"


#sheet name
sheet_name = 'Sheet 1'


url=f'https://docs.google.com/spreadsheet/ccc?key={gsheetkey}&output=xlsx'
df = pd.read_excel(url,sheet_name=sheet_name)
print(df)

在谷歌工作表文件到文件 > 发布到网络 > 选择。 csv (见屏幕快照) > 复制链接

谷歌表格: 发布到网络

密码

import pandas as pd


path = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vSvmELTzIjfSmX8GuV3HE2qomN3uRyvPX8RDzpw77JH33DUbj1bjech7H6NYPArvpZFux0DdJ5L5TKy/pub?output=csv'
data = pd.read_csv(path)
print(data)

Google Colab 中的代码

首先

import pandas as pd
pd.read_csv("https://docs.google.com/spreadsheets/d/e/{}/pub?gid=0&single=true&output=csv")

直奔主题:

  • 获取你的谷歌网址

Https://docs.google.com/spreadsheets/d/ 这是你的工作证号码/edit # gid = < strong > 这将是你的标签名,它将是一个数字

我喜欢创建一个函数(不在这里创建) ,这样我就可以分离我的变量

  • Sheet _ ID = “将工作表 ID 放在这里”
  • Sheet _ name = “ Place your sheet # here”

下一个 URL 是个棘手的部分:

url = f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?gid={sheet_name}&format=csv"

那就读出来

Df = pd.csv (url)

就是这样。如果您需要选择一个不同的行作为标题,您可以这样做

Df = pd.csv (url,header = 1)