首页 > 解决方案 > 如果某些子记录不存在,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

标签: pythonpython-3.xpandasdataframenested

解决方案


它不起作用,因为你有一个没有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

推荐阅读