Pandas json_normalize 会产生令人困惑的“KeyError”消息?
Posted
技术标签:
【中文标题】Pandas json_normalize 会产生令人困惑的“KeyError”消息?【英文标题】:Pandas json_normalize produces confusing `KeyError` message? 【发布时间】:2015-11-24 07:38:57 【问题描述】:我正在尝试将嵌套的 JSON 转换为 Pandas 数据框。在遇到某个 JSON 之前,我一直在成功使用 json_normalize
。我制作了一个较小的版本来重现问题。
from pandas.io.json import json_normalize
json=["events": ["schedule": "date": "2015-08-27",
"location": "building": "BDC", "floor": 5,
"ID": 815,
"group": "A",
"schedule": "date": "2015-08-27",
"location": "building": "BDC", "floor": 5,
"ID": 816,
"group": "A"]]
然后我运行:
json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
期待看到这样的东西:
ID group schedule.date schedule.location.building schedule.location.floor
'815' 'A' '2015-08-27' 'BDC' 5
'816' 'A' '2015-08-27' 'BDC' 5
但是我得到了这个错误:
In [2]: json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-2-b588a9e3ef1d> in <module>()
----> 1 json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
/Users/logan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/io/json.pyc in json_normalize(data, record_path, meta, meta_prefix, record_prefix)
739 records.extend(recs)
740
--> 741 _recursive_extract(data, record_path, , level=0)
742
743 result = DataFrame(records)
/Users/logan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/io/json.pyc in _recursive_extract(data, path, seen_meta, level)
734 meta_val = seen_meta[key]
735 else:
--> 736 meta_val = _pull_field(obj, val[level:])
737 meta_vals[key].append(meta_val)
738
/Users/logan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/io/json.pyc in _pull_field(js, spec)
674 if isinstance(spec, list):
675 for field in spec:
--> 676 result = result[field]
677 else:
678 result = result[spec]
KeyError: 'schedule'
【问题讨论】:
【参考方案1】:在这种情况下,我认为你应该使用这个:
In [57]: json_normalize(data[0]['events'])
Out[57]:
group schedule.ID schedule.date schedule.location.building \
0 A 815 2015-08-27 BDC
1 A 816 2015-08-27 BDC
schedule.location.floor
0 5
1 5
meta
路径 ([['schedule','date']...]
) 用于指定与您的记录处于同一嵌套级别的数据,即与“事件”处于同一级别。看起来json_normalize
对带有嵌套列表的字典处理得不是特别好,因此如果您的实际数据要复杂得多,您可能需要进行一些手动整形。
【讨论】:
有什么办法可以代替 schedule.location.floor 作为楼层 您始终可以通过 .rename(columns='schedule.location.floor':'floor') 重命名列【参考方案2】:当 json 的结构不一致时,我得到了 KeyError。意思是,当 json 中缺少一个嵌套结构时,我得到了 KeyError。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.json.json_normalize.html
从 pandas 文档站点上提到的示例中,如果您在其中一条记录上缺少嵌套标签(县),您将收到 KeyError。为了避免这种情况,您可能必须确保忽略丢失的标签或只考虑嵌套列/标签填充数据的记录。
【讨论】:
【参考方案3】:我也遇到了同样的问题!该线程有所帮助,尤其是降落伞py的答案。
我找到了一个解决方案:
df.dropna(subset = *column(s) with nested data*)
然后将生成的 df
保存为新的 json。
加载新的 json,现在您将能够展平嵌套列。
可能有更有效的方法来解决这个问题,但我的解决方案有效。
编辑:忘了提,我尝试在json.normalize()
中使用*errors = 'ignore'*
arg,但没有帮助。
【讨论】:
以上是关于Pandas json_normalize 会产生令人困惑的“KeyError”消息?的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 json_normalize 在 Pandas 中重复列标题?
pandas json_normalize KeyError
Pandas json_normalize 返回 KeyError