python - 如果某些子记录不存在,python json.normalize 错误
问题描述
我需要帮助规范化 pandas DataFrame 中的列。这是输入
df = {0:[{'Code' : 1,'Category' : 'X'},
{'Code' : 2,'Category' : 'Y','snapshots' : [{'Address': {'City': 'City B'}}] },
{'Code' : 3,'Category' : 'Z','snapshots' : [{'Address': {'City': 'City C'}}] }
]
}
df = pd.DataFrame(df)
我的代码:
df_1 = pd_json.json_normalize(df[0],
meta=["Code"],
record_path=["snapshots"],
record_prefix="snapshots.",
errors="ignore"
)
df_2 = (df_1.drop('snapshots.Address', 1)
.assign(**df_1["snapshots.Address"].dropna()
.apply(pd.Series).add_prefix('snapshots.Address.')))
错误:
回溯(最近一次通话最后):
文件“”,第 5 行,在错误 =“忽略”中
json_normalize _recursive_extract(data, record_path, {}, level= 中的文件“C:\Users\my_user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\json\normalize.py”,第 267 行0)
_recursive_extract recs = _pull_field(obj, path[0]) 中的文件“C:\Users\my_user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\json\normalize.py”,第 244 行
文件“C:\Users\my_user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\json\normalize.py”,第 189 行,在 _pull_field 结果 = 结果 [规范]
KeyError:'快照'
DataFrame 中缺少“Code=1”的“快照”。我的想法是将“快照”添加到 DataFrame 中丢失的位置。但我不知道该怎么做。
预期结果:
df_2
Out[617]:
Code snapshots.Address.City
0 1 NaN
1 2 City B
2 3 City C
解决方案
它不起作用,因为你有一个没有snapshots
键的值,所以你需要使用:
df = pd.DataFrame(df[0]).iloc[:, 1:]
df['snapshots.Address.City'] = df.pop('snapshots').apply(lambda x: x[0]['Address']['City'] if x is not np.nan else x)
print(df)
输出:
Code snapshots.Address.City
0 1 NaN
1 2 City B
2 3 City C
推荐阅读
- python - Python,pandas 从 csv 打印最频繁的 1-1000
- system-verilog - 用 let 构造替换 `define
- c - 访问堆栈内存需要多长时间?
- python-3.x - 迭代熊猫数据框中的列列表
- typescript - 通过打字稿在电子中共享数据
- javascript - 我的 Javascript 用完了 asyncIds 吗?(inspector_async_hook.js 中的 RangeError)
- c# - Replace text which contain line breaks without dropping them
- reactjs - 在导航离开事件上反应路由器 v5
- javascript - 框显示警报,但我想要其他方法,例如使用 if 链或 switch 或使用 for 循环或使用 map 运算符
- javafx - 在JavaFX中未硬编码的文本框中键入时如何使用所有颜色