将Google电子表格CSV放入Pandas Dataframe

dar*_*dog 50 python google-apps google-sheets pandas google-drive-api

我上传了一个文件到Google电子表格(用于制作一个公开可访问的示例IPython Notebook,带有数据)我正在使用该文件的原生形式可以读入Pandas Dataframe.所以现在我使用下面的代码来阅读电子表格,工作正常,但只是作为字符串,我没有任何运气试图让它回到数据帧(你可以得到数据)

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

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

',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
Run Code Online (Sandbox Code Playgroud)

引入磁盘驻留文件的本机pandas代码如下所示:

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

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

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

https://docs.google.com/spreadsheets/d/177_dFZ0i-duGxLiyg6tnwNDKruAYE-_Dd8vAQziipJQ/export?format=csv&id
Run Code Online (Sandbox Code Playgroud)

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

Max*_*nis 55

似乎没有我的工作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
Run Code Online (Sandbox Code Playgroud)

BTW,包括?gid=导入不同的工作表,在URL中找到gid.

  • 仅当电子表格公开时才有效 (4认同)
  • 很好的解决方案。当工作表以“Internet 上任何拥有此链接的人都可以查看”方式共享时有效。请注意,“index_col”和“parse_dates”参数是可选的。 (2认同)

Tom*_*ger 51

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

from io import BytesIO

import requests
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  
Run Code Online (Sandbox Code Playgroud)

  • 澄清"如果你正在使用它,就会在python3中移动":来自io import StringIO (5认同)

小智 9

我的方法有点不同.我只是使用pandas.Dataframe()但显然需要安装和导入gspread.它工作正常!

gsheet = gs.open("Name")
Sheet_name ="today"
wsheet = gsheet.worksheet(Sheet_name)
dataframe = pd.DataFrame(wsheet.get_all_records())
Run Code Online (Sandbox Code Playgroud)

  • 只是为了澄清,`gs` 将是 `gs = gspread.authorize(credentials)` (2认同)

Ken*_*old 9

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

sheet_url = 'https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER'
Run Code Online (Sandbox Code Playgroud)

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

csv_export_url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')
Run Code Online (Sandbox Code Playgroud)

然后我们将它传递给pd.read_csv,它可以获取一个URL.

df = pd.read_csv(csv_export_url)
Run Code Online (Sandbox Code Playgroud)

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

  • 我收到 ParserError: 标记数据时出错。C 错误:第 6 行应有 1 个字段,但看到了 2 个字段 (3认同)

Gia*_*gna 6

我一直在使用以下实用程序,到目前为止它有效:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


小智 5

第一的

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


JQT*_*QTs 5

开门见山:

  • 获取你的谷歌网址

https://docs.google.com/spreadsheets/d/ 这是您的工作表 ID 号/edit?gid=这将是您的选项卡名称,它将是一个数字。每个选项卡都有自己的

我喜欢创建一个函数(不是在这里创建),所以我将变量分开

  • sheet_id =“在此放置您的工作表 ID”
  • sheet_name =“将您的工作表#放在这里”

下一个 URL 是棘手的部分:

url = f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?gid={sheet_name}&format=csv"
Run Code Online (Sandbox Code Playgroud)

然后读进去就可以了

df = pd.csv(url)

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

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

  • 使用“df = pd.read_csv(url)”而不是“df = pd.csv(url)”。 (2认同)