展开列数据框嵌套字典

Posted

技术标签:

【中文标题】展开列数据框嵌套字典【英文标题】:Expand column dataframe nested dictionary 【发布时间】:2021-04-18 10:32:05 【问题描述】:

我做了一些尝试,但未能达到目标。 我完全确定这是一个容易有人马上解决的问题。 我正在尝试将 json 输出解析为数据框,但我被困在嵌套字典中。 给定这个例子:

'queryResponse': '@count': 9364,
               '@domain': 'ROOT-DOMAIN',
               '@first': 0,
               '@last': 4,
               '@requestUrl': 'https://10.71.167.210/webacs/api/v4/data/Devices?.full=true&.maxResults=5',
               '@responseType': 'listEntityInstances',
               '@rootUrl': 'https://10.71.167.210/webacs/api/v4/data',
               '@type': 'Devices',
               'entity': ['@dtoType': 'devicesDTO',
                           '@type': 'Devices',
                           '@url': 'https://10.71.167.210/webacs/api/v4/data/Devices/3795793',
                           'devicesDTO': '@displayName': '3795793',
                                          '@id': 3795793,
                                          'adminStatus': 'MANAGED',
                                          'collectionDetail': '<status><general '
                                                              'code="SUCCESS"/></status>',
                                          'collectionStatus': 'COMPLETED',
                                          'collectionTime': '2021-01-12T21:43:02.337Z',
                                          'creationTime': '2016-05-05T10:18:39.182Z',
                                          'deviceId': 3984007,
                                          'deviceName': 'AP-02Expressdamiantellez.carrefour.es',
                                          'deviceType': 'Cisco Aironet '
                                                        '1210 Access Point',
                                          'ipAddress': '10.217.36.112',
                                          'location': 'AP-02',
                                          'managementStatus': 'MANAGED_AND_SYNCHRONIZED',
                                          'manufacturerPartNrs': 'manufacturerPartNr': ['partNumber': 'AIR-AP1231G-E-K9    '],
                                          'productFamily': 'Autonomous AP',
                                          'reachability': 'REACHABLE',
                                          'softwareType': 'ios',
                                          'softwareVersion': '12.3(8)JEE',

我已经能够解析到这个数据框: df_inventory

我需要将“PartNumber”(或新列)修改为包含的确切部件号(例如“WS-C2950C-24”)。 这是我的尝试:

df['newPartNumber'] = df['manufacturerPartNrs']['manufacturerPartNr'][0]['partNumber'].strip()

我得到一个 KeyError: 'manufacturerPartNr' 试图这样做。

这是df:

'deviceName': 0: 'AP-02Expressdamiantellez.carrefour.es', 1: 'AP-01expressastorga.carrefour.es', 2: 'SW-Viajes-1.elche', 3: 'SW-Express-116-1.expresspuentearce', 4: 'Z-Win2.es.wcorp.carrefour.com', 'deviceType': 0: 'Cisco Aironet 1 210 Access Point', 1: 'Cisco Aironet 1210 Access Point', 2: 'Cisco Catalyst 2950C 24 Switch', 3: 'Cisco Catalyst 2960-24-S Switch', 4: 'Cisco Catalyst 4506 Switch', 'ipAddress': 0: '10.217.36.112', 1: '10.209.221.111', 2: '10.68.87.145', 3: '10.209.116.125', 4: '10.71.79.52', 'softwareVersion': 0: '12.3(8)JEE', 1: '12.3(8)JEE', 2: '12.1(22)EA14', 3: '15.0(2)SE10a', 4: '12.2(53)SG1', 'PartNumber': 0: "'manufacturerPartNr': ['partNumber': 'AIR-AP1231G-E-K9']", 1: "'manufacturerPartNr': ['partNumber': 'AIR-AP1231G-E-K9  ']", 2: "'manufacturerPartNr': ['partNumber': 'WS-C2950C-24']", 3: "'manufacturerPartNr': ['partNumber': 'WS-C2960-24-S']", 4: "'manufacturerPartNr': ['partNumber': 'WS-C4506']"

有人可以帮我完成这最后一步吗?

【问题讨论】:

【参考方案1】:

我可以解决这个问题。 如果有人觉得它有用,我会发布答案。

df["NewPart"] = [i['manufacturerPartNr'][0]['partNumber'].strip() for i in df['manufacturerPartNrs']]

【讨论】:

以上是关于展开列数据框嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中提取嵌套字典

在另一个字典中嵌套一个计数器,其中键是数据框列

来自数据框的嵌套字典,内部字典包含熊猫系列作为值

用 Pandas 数据框中的行填充嵌套字典

来自熊猫数据框嵌套字典的熊猫数据框

从熊猫数据框创建嵌套字典