【问题标题】:python json.normalize error if some subrecords do not exist如果某些子记录不存在,python json.normalize 错误
【发布时间】:2019-12-03 10:29:00
【问题描述】:

我需要帮助规范化 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.')))

错误:

Traceback(最近一次通话最后一次):

文件“”,第 5 行,在 错误=“忽略”

文件 "C:\Users\my_user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\json\normalize.py", 第 267 行,在 json_normalize _recursive_extract(data, record_path, {}, level=0)

文件 "C:\Users\my_user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\json\normalize.py", 第 244 行,在 _recursive_extract recs = _pull_field(obj, path[0])

文件 "C:\Users\my_user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\json\normalize.py", 第 189 行,在 _pull_field 结果 = 结果[规格]

KeyError: 'snapshots'

DataFrame 中缺少“Code=1”的“快照”。 我的想法是将“快照”添加到 DataFrame 中丢失的地方。但我不知道该怎么做。

预期结果:

df_2
Out[617]: 
   Code snapshots.Address.City
0     1                    NaN
1     2                 City B
2     3                 City C

【问题讨论】:

    标签: python python-3.x pandas dataframe nested


    【解决方案1】:

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

    【讨论】:

    • 谢谢@U10-Forward。我尝试在我的案例中对其进行修改,但没有成功。如果“快照”中会有更多列,而不仅仅是“地址”。此外,“地址”中的列不仅是“城市”。因此,结果中的列将是,例如:代码、snapshots.columnA、snapshots.columnB、snapshots.columnC、snapshots.Address.City、snapshots.Address.Street、snapshots.Address.postcode、snapshots.Address.Number 等。 ??
    猜你喜欢
    • 2019-04-15
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多