问题描述
我正在尝试在具有高度变化的嵌套 json 的数据文件上运行 pandas.json_normalize,其中记录的内容可能会有很大差异。
我正在处理房屋清单文件并试图提取价格。价格数据存储如下,“价格”位于 json 文件中的第一个嵌套级别:
"prices": [
{
"amountMax": 420000,"amountMin": 420000,"availability": "false","currency": "USD","dateSeen": [
"2020-12-21T11:57:17.190Z","2020-12-25T02:35:41.009Z"
],"isSale": "false","isSold": "true","pricePerSquareFoot": 235,"sourceURLs": [
"https://www.redfin.com/FL/Coconut-Creek/.../home/4146834"
]
},# followed by additional entries
我正在使用以下代码行,如果我将输入文件编辑为包含“价格”部分的单个记录,则该代码行:
df3 = pd.json_normalize(df['records'],record_path='prices',Meta=['id'],errors='ignore'
)
但是,完整文件包含许多不包含价格部分的记录。如果我针对具有 2 条记录(一个有,一个没有)的文件运行代码,它会因 KeyError: 'prices'
而失败显然 json_normalize 中的 'errors='ignore'' 不足以处理错误。
我能做什么?我只想完全跳过没有价格的记录。
解决方法
对您的 JSON 进行列表理解即可。我已经合成了一些 JSON 来匹配您对输入数据的描述。
js = {
"records": [
{
"prices": [
{
"amountMax": 420000,"amountMin": 420000,"availability": "false","currency": "USD","dateSeen": [
"2020-12-21T11:57:17.190Z","2020-12-25T02:35:41.009Z"
],"isSale": "false","isSold": "true","pricePerSquareFoot": 235,"sourceURLs": [
"https://www.redfin.com/FL/Coconut-Creek/.../home/4146834"
]
}
],"id": 1
},{"id":2}
]
}
pd.json_normalize({"records":[r for r in js["records"] if "prices" in r.keys()]}["records"],record_path="prices",meta="id")