将 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_col
和 parse_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=csvimport pandas as pd
pd.read_csv("https://docs.google.com/spreadsheets/d/e//pub?gid=0&single=true&output=csv")
【讨论】:
以上是关于将 Google 电子表格 CSV 导入 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Google Sheets API V4 导入 CSV 文件
将 Excel 电子表格或 CSV 中的数据导入 MySQL