2017-11-16 10 views
0

パンダのデータフレームのインデックスに問題があります。私がしようとしているのは、JSONファイルからデータをロードし、Pandasデータフレームを作成し、そのデータフレームから特定のフィールドを選択してデータベースに送信することです。あなたの助けのための https://pastebin.com/Bzatkg4LパンダKeyError:「['value']インデックスにありません」

import pandas as pd 
from pandas.io import sql 
import MySQLdb 
from sqlalchemy import create_engine 

# Open and read the text file where all the Tweets are 
with open('US_tweets.json') as f: 
    tweets = f.readlines() 

# Convert the list of Tweets into a structured dataframe 
df = pd.DataFrame(tweets) 
# Attributes needed should be here 
df = df[['created_at', 'screen_name', 'id', 'country_code', 'full_name', 'lang', 'text']] 

# To create connection and write table into MySQL 
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}" 
         .format(user="blah", 
           pw="blah", 
           db="blah")) 

df.to_sql(con=engine, name='US_tweets_Table', if_exists='replace', flavor='mysql') 

ありがとう:

以下は、あなたが実際にフィールドが存在して見ることができるようにJSONファイルに何があるかへのリンクです!

+0

オリジナルのデータフレームは正しく構築されていますか?特に、そのデータフレームにはどのような列がありますか? – Evan

+0

@Evanあなたが正しいかもしれないと思いますが、データフレームの列を作成するにはどうすればいいですか?私が間違っていると私を修正しますが、JSONファイルの属性に関連付けられたデータフレームに列を作成する必要があると言えます。いったんこれらの列が作成されると、属性を列に追加できますか? –

+0

参照しようとしている列が索引にないため、エラーが発生します。つまり、最初に作成した列には存在しません。それらはJSONファイル内のオブジェクト内に存在しますが、pandasは最高レベルのためにJSON内のすべてのオブジェクトの列を作成しません。 – Evan

答えて

0

Pandasは、JSONファイル内のすべてのオブジェクトをデータフレーム内の列にマッピングしません。

with open('tweets.json') as f: 
    df = pd.read_json(f, lines = True) 
df.columns 

戻り値:あなたのサンプルファイルは、24列が含まれ

Index(['contributors', 'coordinates', 'created_at', 'entities', 
    'favorite_count', 'favorited', 'geo', 'id', 'id_str', 
    'in_reply_to_screen_name', 'in_reply_to_status_id', 
    'in_reply_to_status_id_str', 'in_reply_to_user_id', 
    'in_reply_to_user_id_str', 'is_quote_status', 'lang', 'metadata', 
    'place', 'retweet_count', 'retweeted', 'source', 'text', 'truncated', 
    'user'], 
    dtype='object') 

はJSONデータを深く掘ることを、私はこの解決策を見つけたが、私はよりエレガントなアプローチが存在している願っています:How do I access embedded json objects in a Pandas DataFrame?

たとえば、df['entities'].apply(pd.Series)['urls'].apply(pd.Series)[0].apply(pd.Series)['indices'][0][0] は、117を返します。

full_nameにアクセスし、それがDFにコピーするには、これを試してください:0 Austin, TXを返す df['full_name'] = df['place'].apply(pd.Series)['full_name']を、。

+0

Hey Evan、あなたは本当に良い解決策を与えましたが、同じ方法で 'text'や 'id'などの他の属性にアクセスしようとすると、エラーが発生します。そしてなぜあなたは 'full_name'にdf ['place']を適用しましたか?私は '場所'なしでそれを試して、それは私が他の属性にアクセスするのと同じエラーを与えました。 –

+0

** UPDATE ** Ok次の属性は 'print(df ['attribute_here'])':text、created_at、id、langから簡単にアクセスできます。 ** screen_name **と** country_code **だけが空です。 –

+0

**更新2 ** OKですので、screen_name **を印刷する方法を理解したので、JSONファイルを調べるまで、 'full_name'の 'place'を追加した理由を理解できませんでした。属性 'user'には 'screen_name'が含まれていたため、それが有効でした。今、データベースをインポートするために最善を尽くします。エヴァンありがとう! –

関連する問題