熊猫-嵌套的json文件

时间:2019-09-09 11:31:10

标签: python json pandas

我是Python新手,想使用Padas从json提取数据。

Json的嵌套结构如下:

deviceIds

作为输出,我需要一行:级别0的'idDriver',然后一行中的标识/车辆节点的'licensePlate':

我尝试申请的是:

(从API加载数据后效果很好)

{
    "idDriver": "100001",
    "defaultTripType": "private",
    "fleetManagerRole": null,
    "identifications": [
        {
            "code": "90-00-00-77-20",
            "from": "2019-08-08T10:38:15Z",
            "rawId": "",
            "vehicle": {
                "isBusinessCar": "0",
                "id": "10000",
                "licensePlate": "ABCD",
                "class": "Suziki 1.6 CDTI",
                }
            }
        }
    ]
}

对此我将不胜感激。

亲切的问候, 槟榔

3 个答案:

答案 0 :(得分:0)

我会像这样重建您的字典:

New_Data = {
"id" : [],
"licensePlate" : []
}

New_Data["id"].append(data["idDriver"])
New_Data["licensePlate"].append(data["identifications"][0]["vehicle"]["licensePlate"])

如果您有很多数据[“标识”],则可以轻松查看它们,如果有很多驱动程序,您也可以这样做。

答案 1 :(得分:0)

对我来说,您的第一个代码很好用,只有在必要时才从列名称中删除vehicle.文本:

json_data  = {
    "idDriver": "100001",
    "defaultTripType": "private",
    "fleetManagerRole": 'null',
    "identifications": [
        {
            "code": "90-00-00-77-20",
            "from": "2019-08-08T10:38:15Z",
            "rawId": "",
            "vehicle": {
                "isBusinessCar": "0",
                "id": "10000",
                "licensePlate": "ABCD",
                "class": "Suziki 1.6 CDTI",
                }
            }
    ]
}
workdata = json_normalize(json_data, record_path= ['identifications'],  meta=['idDriver'])
print (workdata)
             code                  from rawId vehicle.isBusinessCar  \
0  90-00-00-77-20  2019-08-08T10:38:15Z                           0   

  vehicle.id vehicle.licensePlate    vehicle.class idDriver  
0      10000                 ABCD  Suziki 1.6 CDTI   100001  

workdata.columns = workdata.columns.str.replace('vehicle\.','')
print (workdata)
             code                  from rawId isBusinessCar     id  \
0  90-00-00-77-20  2019-08-08T10:38:15Z                   0  10000   

  licensePlate            class idDriver  
0         ABCD  Suziki 1.6 CDTI   100001  

答案 2 :(得分:0)

我最近编写了一个程序包来轻松处理此类任务,称为cherrypicker。我认为以下代码片段将通过CherryPicker实现您的任务:

type

from cherrypicker import CherryPicker json_data = json.loads(myResponse.text) picker = CherryPicker(json_data) flat_data = picker.flatten['idDriver', 'identifications_0_vehicle_licensePlate'].get() 会看起来像这样(我假设您的数据实际上是对象列表,就像您上面描述的那样):

flat_data

然后可以将其加载到数据框中,如下所示:

[['100001', 'ABCD'], ...]

如果您想以稍微不同的方式来整理数据(例如,您想要每个车牌/驾驶员ID组合,而不仅仅是每个驾驶员的第一个车牌),那么尽管可能需要,您也应该能够这样做两三行,而不只是一行。查看我们的文档,以获取其他使用方式的示例:https://cherrypicker.readthedocs.io

要安装cherrypicker,只需import pandas as pd df = pd.DataFrame(flat_data, columns=["idDriver", "licensePlate"])