如何解压缩嵌套字典,其中并非每个***键都具有所有二级键?
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 时,并非所有键都有效