【问题标题】:how to move values from pandas columns with dicts into new columns containing just the value如何将带有dicts的pandas列中的值移动到仅包含该值的新列中
【发布时间】:2020-12-05 21:45:21
【问题描述】:

我有一个高度嵌套的 JSON 文件,我将其规范化为 Pandas 数据框。结果是所有的键都变成了列,而值变成了行。问题是我有一些列仍然包含字典并且没有正确规范化。数据框有超过 8000 行和 3000 列,因此无法手动完成。

这是 JSON 文件:https://justpaste.it/9nfke

例如:

我有以下列命名:

Return.ReturnData.IRS990PF.AnalysisIncomeProducingActyGrp.OtherRevenueDescribedGrp

其中包含字典,如下所示:

[{'Desc': 'MISCELLANEOUS', 'ExclusionCd': '01', 'ExclusionAmt': '13'}, {'Desc': 'GRANT REFUNDS', 'RelatedOrExemptFunctionIncmAmt': '159502'}]

如您所见,有一个 Desc ExclusionCd ExclusionAmt 等。

我已经在我的数据框中填充了以这些命名的列:

Return.ReturnData.IRS990PF.AnalysisIncomeProducingActyGrp.OtherRevenueDescribedGrp.BusinessCd Return.ReturnData.IRS990PF.AnalysisIncomeProducingActyGrp.OtherRevenueDescribedGrp.Desc Return.ReturnData.IRS990PF.AnalysisIncomeProducingActyGrp.OtherRevenueDescribedGrp.ExclusionAmt Return.ReturnData.IRS990PF.AnalysisIncomeProducingActyGrp.OtherRevenueDescribedGrp.ExclusionCd Return.ReturnData.IRS990PF.AnalysisIncomeProducingActyGrp.OtherRevenueDescribedGrp.RelatedOrExemptFunctionIncmAmt Return.ReturnData.IRS990PF.AnalysisIncomeProducingActyGrp.OtherRevenueDescribedGrp.UnrelatedBusinessTaxblIncmAmt

如何将这些值移动到它们各自的列中?请记住,我可能有数百个这样的,我不能手工完成。它需要自动化。谢谢!

【问题讨论】:

    标签: python json pandas json-normalize


    【解决方案1】:
    • 发布的数据显示一条记录,不清楚该文件是否包含这些记录的列表。
    • 使用 pandas,是解析 pd.json_normalize 中 JSON 记录列表的最佳方法。
      • 该示例很长,无法在答案中发布,但请注意,当您在本地运行此示例时,所有键都已解析出来,并且没有dicts 作为连续值。
    • 此键 Return.ReturnData.IRS990PF 在 PasteBin 数据示例中不可用。
      • IRS990 键中,只有IRS990IRS990Schedule... 可用。
    • 另一种解压字典列表值的方法是使用json_normalizemeta 参数
      • 请参阅此answer 了解一个很好的示例
    import pandas as pd
    import json
    from pathlib import Path
    
    # path to file
    p = Path('c:\some_path\test.json')
    
    # read in the JSON file
    with p.open('r', encoding='utf-8') as f:
        data = json.loads(f.read())
    
    # parse with pandas
    df = pd.json_normalize(data)
    
    # if there's a list of dictionaries in the resulting dataframe, they can be unpacked with something like
    df['Return.ReturnData.IRS990ScheduleO.SupplementalInformationDetail'].apply(pd.json_normalize)
    

    【讨论】:

    • 我很想尝试新的方法,但是我花了很多时间清理这些数据(正如你可能想象的那样,有 40 几百万个值),所以此时我无法真正重新开始。我将尝试仅对特定列进行规范化。我很欣赏这种洞察力。
    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 2023-02-23
    • 2020-08-02
    • 2021-12-31
    • 2014-02-11
    • 2021-02-05
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多