![](/img/trans.png)
[英]TypeError: string indices must be integers error when parsing Json with Python
[英]python pandas - TypeError when parsing JSON: string indices must be integers
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
*这是《 Python for Data Analysis 》一书中的示例
for rec in db
遍历列名 。 要遍历行,
for id, rec in db.iterrows():
fnuts = pd.DataFrame(rec["nutrients"])
fnuts["id"] = rec["id"]
nutrients.append(fnuts)
但是,这有点慢(所有需要构建的字典)。 itertuples
更快 但由于您只关心两个序列,因此直接迭代序列可能是最快的:
for id, value in zip(db['id'], db['nutrients']):
fnuts = pd.DataFrame(value)
fnuts["id"] = id
nutrients.append(fnuts)
该代码可以正常工作,但是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}]}]
此示例仅包含一个记录。
Amadan回答了这个问题,但是在看到他的回答之前,我设法这样解决了这个问题:
for i in range(len(db)):
rec = db.loc[i]
fnuts = pd.DataFrame(rec["nutrients"])
fnuts["id"] = rec["id"]
nutrients.append(fnuts)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.