2017-08-30 11 views
0

このようなJSONファイルの外観のレコード(「栄養素」とはどのようなものか注意してください)でなければなりません:のpythonパンダ - 例外TypeError JSONをパース:文字列のインデックスは整数

{ 
"id": 21441, 
"description": "KENTUCKY FRIED CHICKEN, Fried Chicken, EXTRA CRISPY, 
Wing, meat and skin with breading", 
"tags": ["KFC"], 
"manufacturer": "Kentucky Fried Chicken", 
"group": "Fast Foods", 
"portions": [ 
{ 
"amount": 1, 
"unit": "wing, with skin", 
"grams": 68.0 
}, 
... 
], 
"nutrients": [ 
{ 
"value": 20.8, 
"units": "g", 
"description": "Protein", 
"group": "Composition" 
}, 
{'description': 'Total lipid (fat)', 
'group': 'Composition', 
'units': 'g', 
'value': 29.2} 
... 
] 
} 

次はからのコードです本の運動*。これは、いくつかの論争が含まれており、単一の大きなテーブルに各食品の栄養素を組み立て:

import pandas as pd 
import json 

db = pd.read_json("foods-2011-10-03.json") 

nutrients = [] 

for rec in db: 
    fnuts = pd.DataFrame(rec["nutrients"]) 
    fnuts["id"] = rec["id"] 
    nutrients.append(fnuts) 

しかし、私は次のエラーを取得すると、私はその理由を把握することはできません。


TypeError         Traceback (most recent call last) 
<ipython-input-23-ac63a09efd73> in <module>() 
     1 for rec in db: 
----> 2  fnuts = pd.DataFrame(rec["nutrients"]) 
     3  fnuts["id"] = rec["id"] 
     4  nutrients.append(fnuts) 
     5 

TypeError: string indices must be integers 

を*これは本の例です

+0

をごJSONは有効ではありません(また、引用符を修正してドットを削除しても、 'pd.read_json'で読み込むことはできません)。問題が実際に表示されるデータを送信してください。 – Amadan

+0

@Amadan、ここにデータへのリンクがあります:https://github.com/wesm/pydata-book/blob/master/ch07/foods-2011-10-03.json –

答えて

1

for rec in db列名を繰り返します。行を反復するには、

for id, rec in db.iterrows(): 
    fnuts = pd.DataFrame(rec["nutrients"]) 
    fnuts["id"] = rec["id"] 
    nutrients.append(fnuts) 

これは、(構築に必要なすべてのdicts)しかし少し遅いです。 itertuplesは高速です。あなたはたったの約2つのシリーズを気にするのではなく、シリーズを反復処理することは、直接、おそらく最速です:

for id, value in zip(db['id'], db['nutrients']): 
    fnuts = pd.DataFrame(value) 
    fnuts["id"] = id 
    nutrients.append(fnuts) 
+0

ありがとう、それはうまくいきます!本書が書かれて以来、この反復がどのように機能するか、またはこれが本の正誤表に追加されるべきかに変更がありましたか? –

+0

申し訳ありませんが、私はパンダの歴史についてあまり知らないし、私は本を読んでいない。 – Amadan

0

コードは正常に動作しますが、コードは正常に動作しますが、jsonは次のようになります。

[{ 
"id": 21441, 
"description": "KENTUCKY FRIED CHICKEN, Fried Chicken, EXTRA CRISPY,Wing, meat and skin with breading", 
"tags": ["KFC"], 
"manufacturer": "Kentucky Fried Chicken", 
"group": "Fast Foods", 
"portions": [ 
{"amount": 1, 
"unit": "wing, with skin", 
"grams": 68.0}], 
"nutrients": [{ 
"value": 20.8, 
"units": "g", 
"description": "Protein", 
"group": "Composition" 
}, 
{'description': 'Total lipid (fat)', 
'group': 'Composition', 
'units': 'g', 
'value': 29.2}]}] 

これは1レコードのみの例です。

0

Amadanは質問に答えたが、私は彼の答えを見に、この前のようにそれを解決するために管理:

for i in range(len(db)): 
    rec = db.loc[i] 
    fnuts = pd.DataFrame(rec["nutrients"]) 
    fnuts["id"] = rec["id"] 
    nutrients.append(fnuts) 
関連する問題