2013-10-26 70 views
30

我上传了一个文件到Google电子表格(用数据创建了一个可公开访问的示例IPython Notebook)我使用的是原生格式的文件,可以读入Pandas Dataframe。所以现在我用下面的代码来阅读电子表格,工作正常,但只是以字符串形式出现,并且我没有任何运气试图让它回到数据框中(您可以获取数据)将Google Spreadsheet CSV文件导入Pandas Dataframe

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

数据最终看起来像:(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 

,在磁盘驻留文件所带来的本地大熊猫代码如下所示:

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

“干净”的解决方案将是有益的至 许多人提供一种简单的方法来共享Pandas使用的数据集!我尝试了一堆替代品,但没有成功,我很确定我再次失去了一些明显的东西。

只是一个更新注意新的谷歌电子表格都有不同的URL模式在上面的例子中就用这个来代替URL和或以下的答案,你应该罚款这里有一个例子:

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

看到@Max Ghenis以下解决方案,它只是用pd.read_csv,不需要StringIO的或请求...

回答

36

您可以将StringIO对象使用read_csv()

from StringIO import StringIO # got moved to io in python3. 

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

In [10]: df = pd.read_csv(StringIO(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 
+1

非常有帮助......需要学习StringIO! – dartdog

+0

我正在寻找几周,如何将电子表格导入熊猫。从来没有听说过请求或StringIO库。谢谢!! – moldovean

+0

注意新的谷歌电子表格版本 – dartdog

26

似乎为我工作,没有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 

BTW,包括?gid=能使导入不同的表,发现在URL中的GID。

+0

好点也是你使用P3?没有机会重新检查也不错,不需要请求... – dartdog

+0

是的,我正在使用Python 3. –

+1

伟大的解决方案,只是验证它,更好! – dartdog

1

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

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

不错..界面越来越清洁! – dartdog

1

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

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) 

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

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

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

另请注意,您的电子表格必须是公开的,每个拥有该链接的人都可以阅读。

相关问题