Google Spreadsheet CSV in een Pandas-dataframe plaatsen

Ik heb een bestand geüpload naar Google-spreadsheets (om een ​​openbaar toegankelijk voorbeeld te maken van IPython Notebook, met gegevens). Ik gebruikte het bestand in zijn oorspronkelijke vorm om in een Pandas-dataframe te worden ingelezen. Dus nu gebruik ik de volgende code om de spreadsheet te lezen, werkt prima, maar komt gewoon binnen als string, en ik heb geen geluk om het terug in een dataframe te krijgen (je kunt de gegevens krijgen)

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

De gegevens zien er uiteindelijk als volgt uit: (1e rij koppen)

',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

De oorspronkelijke panda-code die het residente bestand van de schijf binnenbrengt, ziet er als volgt uit:

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

Een “schone” oplossing zou voor velen nuttig zijn om een ​​gemakkelijke manier te bieden om datasets te delen voor gebruik door Panda’s! Ik heb een heleboel alternatieven geprobeerd zonder succes en ik ben er vrij zeker van dat ik weer iets voor de hand liggends mis.

Gewoon een update-notitie De nieuwe Google-spreadsheet heeft een ander URL-patroon. Gebruik dit gewoon in plaats van de URL in het bovenstaande voorbeeld en of het onderstaande antwoord en je zou in orde moeten zijn, hier is een voorbeeld:

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

zie onderstaande oplossing van @Max Ghenis die zojuist pd.read_csv heeft gebruikt, StringIO of verzoeken zijn niet nodig…


Antwoord 1, autoriteit 100%

Het lijkt voor mij te werken zonder de 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, inclusief de ?gid=maakt het importeren van verschillende bladen mogelijk, zoek de gid in de URL.


Antwoord 2, autoriteit 88%

U kunt read_csv()gebruiken op een StringIO-object:

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  

Antwoord 3, autoriteit 28%

Open het specifieke blad dat je wilt in je browser. Zorg ervoor dat deze in ieder geval zichtbaar is voor iedereen met de link. Kopieer en plak de URL. Je krijgt zoiets als https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER.

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

Eerst zetten we dat om in een CSV-export-URL, zoals https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/export?format=csv&gid=NUMBER:

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

Vervolgens geven we het door aan pd.read_csv, die een URL kan hebben.

df = pd.read_csv(csv_export_url)

Dit gaat kapot als Google zijn API wijzigt (het lijkt ongedocumenteerd) en kan nutteloze fouten geven als er een netwerkstoring optreedt.


Antwoord 4, autoriteit 14%

Mijn aanpak is een beetje anders. Ik heb zojuist pandas.Dataframe() gebruikt, maar moest natuurlijk gspread installeren en importeren. En het werkte prima!

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

Antwoord 5, autoriteit 10%

Ik heb de volgende hulpprogramma’s gebruikt en het werkte tot nu toe:

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)

U moet de bladnaam en de sleutel opgeven. De sleutel is de tekenreeks die u van de url in het volgende pad krijgt: https://docs.google.com/spreadsheets/d/{key}/edit/.

Je kunt de waarde van koppen wijzigen als je meer dan één rij voor de kolomnamen hebt, maar ik weet niet zeker of het nog steeds werkt met meerdere koppen.

Het kan remmen als Google hun API’s wijzigt.

Houd er ook rekening mee dat uw spreadsheet openbaar moet zijn, iedereen met de link kan deze lezen.


Antwoord 6, autoriteit 4%

Als het csv-bestand is gedeeld via drive en niet via spreadsheet, zou de onderstaande wijziging van de url werken

#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)

En het dataframe zou zijn (als je net de bovenstaande code had uitgevoerd)

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

Zie de werkende code hier.


Antwoord 7, autoriteit 3%

Ga in het Google Spreadsheets-bestand naar Bestand > Publiceren op het web > Selecteer .csv (zie screenshot) > Kopieer link

Google Spreadsheets: publiceren op internet

Code

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


Antwoord 8

Eerste

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

Antwoord 9

Dit werkt voor mij.

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)

Other episodes