将JSON导入Pandas

时间:2017-07-07 23:04:39

标签: python json pandas dataframe

我必须遵循来自API的JSON(例如my_json)。实体数组存储在名为entities的键中:

{
    "action" : "get",
    "application" : "4d97323f-ac0f-11e6-b1d4-0eec2415f3df",
    "params" : {
      "limit" : [ "2" ]
    },
    "path" : "/businesses",
    "entities" : [
        {
            "uuid" : "508d56f1-636b-11e7-9928-122e0737977d",
            "type" : "business",
            "size" : 730 },
        {
            "uuid" : "2f3bd4dc-636b-11e7-b937-0ad881f403bf",
            "type" : "business",
            "size" : 730 
        } ],
  "timestamp" : 1499469891059,
  "duration" : 244,
  "count" : 2
}

我正在尝试将它们加载到数据框中,如下所示:

import pandas as pd

pd.read_json(my_json['entities'], orient='split')

我收到以下错误:

ValueError: Invalid file path or buffer object type: <type 'list'>

我已尝试过记录,但仍然无法正常工作。

5 个答案:

答案 0 :(得分:3)

您使用my_json['entities']的方式使其看起来像是Python dict

根据pandas documentationread_json接收&#34;有效的JSON字符串或类似文件&#34;。您可以使用以下内容将dict转换为json字符串:

import json
json_str = json.dumps(my_json["entities"])

您所描述的密钥"entities"下的数据不符合orient="split"的格式设置策略。您似乎需要使用orient="list"

import pandas as pd

my_json = """{
    "entities": [
            {
                "type": "business",
                "uuid": "199bca3e-baf6-11e6-861b-0ad881f403bf",
                "size": 918
            },
            {
                "type": "business",
                "uuid": "054a7650-b36a-11e6-a734-122e0737977d",
                "size": 984
            }
        ]
}"""

print pd.read_json(my_json, orient='list')

得到以下特性:

                                              entity
0  {u'type': u'business', u'uuid': u'199bca3e-baf...
1  {u'type': u'business', u'uuid': u'054a7650-b36...

import pandas as pd

my_json = """[
    {
        "type": "business",
        "uuid": "199bca3e-baf6-11e6-861b-0ad881f403bf",
        "size": 918
    },
    {
        "type": "business",
        "uuid": "054a7650-b36a-11e6-a734-122e0737977d",
        "size": 984
    }
]"""

print pd.read_json(my_json, orient='list')

得到以下特性:

   size      type                                  uuid
0   918  business  199bca3e-baf6-11e6-861b-0ad881f403bf
1   984  business  054a7650-b36a-11e6-a734-122e0737977d

答案 1 :(得分:3)

如果我怀疑my_json是字典,那么您可以跳过pd.read_json而只是做

pd.DataFrame(my_json['entities'])

   size      type                                  uuid
0   730  business  508d56f1-636b-11e7-9928-122e0737977d
1   730  business  2f3bd4dc-636b-11e7-b937-0ad881f403bf

答案 2 :(得分:1)

danielcorin指出我正确的方向。我最终不得不这样做:

pd.read_json(json.dumps(b_j['entities']) , orient='list')

read_json方法接受一个字符串,所以我转储实体集合并使用它。

答案 3 :(得分:0)

根据官方documenation东方定位是“记录”

df = pd.read_json(json.dumps(b_j['entities']) , orient='records')

答案 4 :(得分:0)

由于错误的变量类型为list,因此会引发错误。

实际上,这使您更容易将其堆叠到数据框中,因为您可以将列表直接堆叠到数据框中。 因此,您可以使用:

df = pd.DataFrame(my_json['entities'])