将 Google 电子表格 CSV 导入 Pandas 数据框

Posted

技术标签:

【中文标题】将 Google 电子表格 CSV 导入 Pandas 数据框【英文标题】:Getting Google Spreadsheet CSV into A Pandas Dataframe 【发布时间】:2013-11-05 20:43:46 【问题描述】:

我将一个文件上传到 Google 电子表格(以制作一个可公开访问的示例 IPython Notebook,其中包含数据)我使用的文件的本机形式可以读入 Pandas Dataframe。所以现在我使用下面的代码来读取电子表格,工作正常,但只是作为字符串输入,而且我没有任何运气试图将它恢复到数据框中(你可以获取数据)

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

引入磁盘驻留文件的原生 pandas 代码如下:

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

一个“干净”的解决方案将有助于为许多人提供一种共享数据集供 Pandas 使用的简单方法!我尝试了一堆替代方案但没有成功,我很确定我又错过了一些明显的东西。

只是一个更新说明新的 Google 电子表格有一个不同的 URL 模式只需使用它来代替上面示例中的 URL 和/或下面的答案,你应该没问题这是一个示例:

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

请参阅下面来自 @Max Ghenis 的解决方案,它只使用了 pd.read_csv,不需要 StringIO 或请求...

【问题讨论】:

您是如何从驱动器中获取csv 链接的? 只需在浏览器中打开电子表格并复制网址 URL 以/edit?ts=5c0e311e#gid=0 结尾,分享链接以/edit?usp=sharing 结尾,没有csv 并且在熊猫代码请求时都给出404 在文档菜单上使用 csv 格式下载 【参考方案1】:

如果没有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。

【讨论】:

好点你也在用P3吗?没有机会重新检查也很好不需要请求... 是的,我正在使用 Python 3。 很好的解决方案,刚刚验证过,好多了! 也许只添加 cmets 关于 index_col 和 parse_dates 的作用?另外,也许这很明显,但我认为这只有在电子表格是公开的情况下才有效;我相信如果不是,您将不得不使用 API。 很好的解决方案。当工作表共享为“Internet 上具有此链接的任何人都可以查看”时工作。请注意,index_colparse_dates 参数是可选的。【参考方案2】:

您可以在 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  

【讨论】:

我一直在寻找如何将电子表格导入 pandas 的方法。从未听说过请求或 StringIO 库。谢谢!! 请注意上面原始问题底部的新 URL 格式,新的 Google 电子表格版本需要它 澄清“如果你正在使用它,在 python3 中移动”:from io import StringIO 谢谢!但我不得不使用这种形式的 google url 来输出 csv:***.com/a/23702001/507544 如何指定工作表(即 URL 中的 #gid=x)?在key= 之后将其添加到 URL 本身不起作用。【参考方案3】:

在浏览器中打开您想要的特定工作表。确保至少有链接的任何人都可以看到它。复制并粘贴 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=')

然后我们将它传递给pd.read_csv,它可以接受一个 URL。

df = pd.read_csv(csv_export_url)

如果 Google 更改其 API(似乎没有记录),这将中断,并且如果发生网络故障,可能会给出无用的错误。

【讨论】:

此代码返回一个用于下载 csv 的 html 页面,而不是来自 gsheet 的 csv 文件。 我收到 ParserError:错误标记数据。 C 错误:第 6 行中应有 1 个字段,看到 2【参考方案4】:

我的方法有点不同。我只是使用了 pandas.Dataframe() 但显然需要安装和导入 gspread。而且效果很好!

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

【讨论】:

不错..界面越来越干净! 澄清一下,gs 将是 gs = gspread.authorize(credentials)【参考方案5】:

我一直在使用以下实用程序,到目前为止它工作正常:

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/

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

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

另外请记住,您的电子表格必须是公开的,知道链接的每个人都可以阅读。

【讨论】:

【参考方案6】:

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

#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

查看工作代码here。

【讨论】:

【参考方案7】:

在 Google 表格文件中,转到文件 > 发布到网络 > 选择 .csv(见屏幕截图)> 复制链接

Google Sheets: Publish to web

代码

import pandas as pd

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

Code in Google Colab

【讨论】:

【参考方案8】:

这对我有用。

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)

【讨论】:

【参考方案9】:

第一

点击文件 选择发布到网络标签 选择您想要作为 CSV 的工作表(如果有多个工作表),还将格式从网页更改为逗号分隔值 点击发布 复制链接如:https://docs.google.com/spreadsheets/d/e//pub?gid=0&single=true&output=csv
import pandas as pd
pd.read_csv("https://docs.google.com/spreadsheets/d/e//pub?gid=0&single=true&output=csv")

【讨论】:

以上是关于将 Google 电子表格 CSV 导入 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何每月使用导入数据自动更新 Google 电子表格?

如何使用 Google Sheets API V4 导入 CSV 文件

将 Excel 电子表格或 CSV 中的数据导入 MySQL

将Google电子表格导入Google电子表格

通过 Google Drive API 从本地 CSV 文件创建 Google Drive 电子表格

在 Excel 中重新创建 Google 电子表格 QUERY()