web-dev-qa-db-ja.com

Google Spreadsheet CSVをA Pandas Dataframeに取り込む

Googleスプレッドシートにファイルをアップロードしました(公開されているIPython Notebookの例を作成し、データを使用)ネイティブ形式のファイルを使用して、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

ディスク常駐ファイルを取り込むネイティブ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

stringIOやリクエストを必要としないpd.read_csvを使用した@Max Ghenisのソリューションを参照してください...

49
dartdog

StringIOオブジェクトでread_csv()を使用できます。

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  
50
TomAugspurger

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を見つけます。

52
Max Ghenis

ブラウザで特定のシートを開きます。少なくともリンクを知っている人が閲覧できるようにしてください。 URLをコピーして貼り付けます。 https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBERのようなものが得られます。

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

まず、https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/export?format=csv&gid=NUMBERのようなCSVエクスポートURLに変換します。

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を変更すると(文書化されていないように見えます)破損し、ネットワーク障害が発生すると、役に立たないエラーが発生する可能性があります。

9
Ken Arnold

私のアプローチは少し異なります。 pandas.Dataframe()を使用しましたが、gspreadのインストールとインポートには明らかに必要でした。そしてそれはうまくいきました!

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

私は次のユーティリティを使用してきましたが、今のところ機能しました:

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を変更すると、ブレーキがかかる場合があります。

また、スプレッドシートは公開する必要があり、リンクを知っている全員がそれを読むことができることに注意してください。

3

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

作業コード こちら をご覧ください。

3
kaza