2017-02-18 15 views
2

入れ子になったJSONファイルをpandas DataFrameに変換しました。いくつかの列には現在リストが含まれています。リストを含むpandas Dataframeの列を展開し、リスト値自体から列名をフェッチする方法はありますか?

0   [BikeParking: True, BusinessAcceptsBitcoin: Fa... 
1   [BusinessAcceptsBitcoin: False, BusinessAccept... 
2   [Alcohol: none, Ambience: {'romantic': False, ... 
3   [AcceptsInsurance: False, BusinessAcceptsCredi... 
4   [BusinessAcceptsCreditCards: True, Restaurants... 
5   [BusinessAcceptsCreditCards: True, ByAppointme... 
6   [BikeParking: True, BusinessAcceptsCreditCards... 
7   [Alcohol: none, Ambience: {'romantic': False, ... 
8      [BusinessAcceptsCreditCards: True] 
9   [BikeParking: True, BusinessAcceptsCreditCards... 
10              None 
. 
. 
. 
144070 [Alcohol: none, Ambience: {'romantic': False, ... 
144071 [BikeParking: True, BusinessAcceptsCreditCards... 
Name: attributes, dtype: object 

と、この::細胞を充填しながら

0   [Monday 11:0-21:0, Tuesday 11:0-21:0, Wednesda... 
1   [Monday 0:0-0:0, Tuesday 0:0-0:0, Wednesday 0:... 
2   [Monday 11:0-2:0, Tuesday 11:0-2:0, Wednesday ... 
3   [Tuesday 10:0-21:0, Wednesday 10:0-21:0, Thurs... 
4              None 

144066             None 
144067 [Tuesday 8:0-16:0, Wednesday 8:0-16:0, Thursda... 
144068 [Tuesday 10:0-17:30, Wednesday 10:0-17:30, Thu... 
144069             None 
144070 [Monday 11:0-20:0, Tuesday 11:0-20:0, Wednesda... 
144071 [Monday 10:0-21:0, Tuesday 10:0-21:0, Wednesda... 
Name: hours, dtype: object 

は私が自動的にタグ(BikeParking、AcceptsInsuranceなど)を抽出し、カラム名としてそれらを使用するためにどのような方法があります彼らはこのようになりますtrue/falseの値で置き換えます。 Ambienceディクテーションでは、Ambience_romanticやtrue/falseのようなものをセル内で実行したいと考えています。同様に、曜日をColumn名として抽出し、時間を使ってセルを埋める必要があります。

以前にjsonデータを平坦化する方法はありますか?私は、jsonデータをjson_normalizeに渡し、出力からデータフレームを作成しようとしましたが、同じ結果が得られます。多分私は何か間違っているのですか?オリジナルJSONの

フォーマット(yelp_academic_dataset_business.json):

with open('yelp_academic_dataset_business.json') as f: 
     #Normalize the json data to flatten it and store output in a dataframe 
     frame= json_normalize([json.loads(line) for line in f]) 

     #write the dataframe to a csv file 
     frame.to_csv('yelp_academic_dataset_business.csv', encoding='utf-8', index=False) 

私は現在、何をしようとしている:

with open(json_filename) as f: 
    data = f.readlines() 

    # remove the trailing "\n" from each line 
    data = map(lambda x: x.rstrip(), data) 

    data_json_str = "[" + ','.join(data) + "]" 

    df = read_json(data_json_str) 
    #Now Looking to expand df['attributes'] and others here 

そして私をjson_normalizeと

{ 
    "business_id":"encrypted business id", 
    "name":"business name", 
    "neighborhood":"hood name", 
    "address":"full address", 
    "city":"city", 
    "state":"state -- if applicable --", 
    "postal code":"postal code", 
    "latitude":latitude, 
    "longitude":longitude, 
    "stars":star rating, rounded to half-stars, 
    "review_count":number of reviews, 
    "is_open":0/1 (closed/open), 
    "attributes":["an array of strings: each array element is an attribute"], 
    "categories":["an array of strings of business categories"], 
    "hours":["an array of strings of business hours"], 
    "type": "business" 
} 

マイinitalの試み私の目的はそれを.csvに変換してデータベースにロードすることです。私は自分のデータベースの列にリストを必要としません。

あなたはYelpのデータセットチャレンジサイトから、元のJSONデータを取得することができます。 https://www.yelp.ca/dataset_challenge/dataset

+0

オリジナルのjsonとあなたの試行を確認できますか? – Parfait

+0

jsonのフォーマットを追加しました。データへのリンクと自分の試みです。 – Koryx

答えて

0

あなたがテーブルに「文書」(半構造化データ)に変換しようとしています。これは、1つのレコードが、例えば、他のレコードがない100個の属性があります。マスター表に100列を追加し、他のすべてのレコードに対して空のセルを持つことは望ましくありません。

しかし、最終的に、あなたはこれを行うつもりことを説明しています

  1. ロードJSONを。
  2. パンダに変換してください。
  3. CSVをエクスポートします。
  4. データベースにインポートします。

ここでは、これはまったく意味がないことを伝えています。これらのすべての中間形式を介してデータをマッシュするだけで問題が発生します。

代わりに、のは基本に戻って取得してみましょう:

  1. ロードJSONを。
  2. データベースに書き込みます。

ここで、最初の手順でスキーマが作成されます。また、NoSQLデータベースを使用している場合は、他の手順を実行することなくJSONを直接ロードできます。

+0

私はこれをMySQLで行う必要があります。この課題の一環として、jsonをMySQLデータベースにロードできる形式に変換するためのスクリプトを作成する必要があります。私はスクリプトを書く必要があります。私はそれが無意味だと理解していますが、私はそれが運動の一部だと思います。 – Koryx

+0

@Koryx:OKなので、このようなものをロードしますか? https://dev.mysql.com/doc/refman/5.7/en/load-data.htmlこれは良いことです...単純に入力JSONをCSVに変換するスクリプトを書くことができます。パンダの必要はありません。関連する複数の表に書き込むことを検討してください。 –

+0

はい私はそれのようにロードします。しかし、パンダを使わずに簡単なスクリプトでjsonデータをどのように平坦化できますか? MySQLにロードするときにcsvカラムのリスト(およびそれらの中のdicts)が問題を引き起こすのではないでしょうか? – Koryx

関連する問題