如何解压缩嵌套字典,其中并非每个***键都具有所有二级键?

Posted

技术标签:

【中文标题】如何解压缩嵌套字典,其中并非每个***键都具有所有二级键?【英文标题】:How can I unpack a nested dictionary where not every top level key has all of the second level keys? 【发布时间】:2020-06-08 01:18:35 【问题描述】:

如果不是每个***键都具有所有二级键,我如何解压缩嵌套字典?

我从网站上抓取了属性数据。该网站为每个属性提供了最多 7 个属性,但属性类型因属性而异(即“土地”属性类型不会将“建筑物大小”显示为属性,因为没有建筑物)。

作为解决此问题的第一步,我将属性类型和值作为单独的列进行抓取,并将数据转换为字典形式,其中每个属性都有一个唯一的 ID_Number 和一系列键:值对。现在我想将该字典解压缩到一个数据框中,其中列标题将代表所有可能的二级键(属性类型),列值将是与属性键关联的“值”。

数据示例如下:

1: ['Status:': 'For Lease',
   'Price:': '$3.17 SF/Mo',
   'Property Type:': 'Retail',
   'Sub-Type:': 'Office, Retail',
   'Spaces:': '2 Spaces',
   'Space Available:': '0.00 - 0.03 AC',
   'Building Size:': '9,161 SF'],
 2: ['Status:': 'For Lease',
   'Price:': '$1.25 SF/Mo',
   'Property Type:': 'Office',
   'Sub-Type:': 'Office',
   'Spaces:': '1 Space',
   'Space Available:': '0.03 AC',
   'Building Size:': '11,332 SF'],
 3: ['Status:': 'For Sale',
   'Price:': 2521740,
   'Property Type:': 'Retail',
   'Sub-Type:': 'Fast Food',
   'Building Size:': '2,410 SF',
   'Cap Rate:': 0.0575,
   'Lot Size:': '76,666 SF'],
 4: ['Status:': 'For Lease',
   'Price:': '$0.63 SF/Mo',
   'Property Type:': 'Retail',
   'Sub-Type:': 'Retail',
   'Spaces:': '1 Space',
   'Space Available:': '0.50 AC',
   'Building Size:': '59,095 SF'],

我将如何提取这个?我在 from_dict 上尝试了几种变体,但没有找到可行的解决方案。

提前致谢!

【问题讨论】:

首先用 Python 将其处理成一个字典,其中的列表包含值 (key:[val,val,..],key:...),然后将其提供给 DataFrame。如果缺少某些键,dict.get 可能会有所帮助。 【参考方案1】:

有几种方法可以做到这一点。我不是熊猫专家,所以可能有更优雅的解决方案。但这就是我如何快速而肮脏地做到这一点(顺便说一句,您提供的示例数据中有 9 个独特的属性,而不是 7 个)。这将通过使它们成为 NaN 来自动处理缺失值:

import pandas as pd

data = 1: ['Building Size:': '9,161 SF',
              'Price:': '$3.17 SF/Mo',
              'Property Type:': 'Retail',
              'Space Available:': '0.00 - 0.03 AC',
              'Spaces:': '2 Spaces',
              'Status:': 'For Lease',
              'Sub-Type:': 'Office, Retail'],
         2: ['Building Size:': '11,332 SF',
              'Price:': '$1.25 SF/Mo',
              'Property Type:': 'Office',
              'Space Available:': '0.03 AC',
              'Spaces:': '1 Space',
              'Status:': 'For Lease',
              'Sub-Type:': 'Office'],
         3: ['Building Size:': '2,410 SF',
              'Cap Rate:': 0.0575,
              'Lot Size:': '76,666 SF',
              'Price:': 2521740,
              'Property Type:': 'Retail',
              'Status:': 'For Sale',
              'Sub-Type:': 'Fast Food'],
         4: ['Building Size:': '59,095 SF',
              'Price:': '$0.63 SF/Mo',
              'Property Type:': 'Retail',
              'Space Available:': '0.50 AC',
              'Spaces:': '1 Space',
              'Status:': 'For Lease',
              'Sub-Type:': 'Retail'],
        

df = pd.DataFrame()
for property_num, property_list in data.items():
    for property_dict in property_list:  # you only have one per list, so this isn't really needed
        df = df.append(property_dict, True)
df.index = data.keys()



>>> print(df)
  Building Size:       Price:  ... Cap Rate:  Lot Size:
1       9,161 SF  $3.17 SF/Mo  ...       NaN        NaN
2      11,332 SF  $1.25 SF/Mo  ...       NaN        NaN
3       2,410 SF      2521740  ...    0.0575  76,666 SF
4      59,095 SF  $0.63 SF/Mo  ...       NaN        NaN

[4 rows x 9 columns]

【讨论】:

谢谢,这让我得到了我想要的输出!

以上是关于如何解压缩嵌套字典,其中并非每个***键都具有所有二级键?的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 字符串转换为 NSDictionary 时,并非所有键都有效

如何使用ant解压缩包含嵌套的zip文件?

如何在 Python 中解压缩 RDD 中每个项目的值(列表)?

如何将字典附加到熊猫数据框?

在python的嵌套json字典中查找一个值

将字典列表解压缩到 Pandas 中的单独列中