首页 > 解决方案 > 如何将带有dicts的pandas列中的值移动到仅包含该值的新列中

问题描述

我有一个高度嵌套的 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

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

标签: pythonjsonpandasjson-normalize

解决方案


  • 发布的数据显示了一条记录,不清楚该文件是否包含这些记录的列表。
  • 使用 pandas,用于解析 .json 中的 JSON 记录列表的最佳方法pd.json_normalize
    • 该示例很长,无法在答案中发布,但请注意,当您在本地运行它时,所有键都被解析出来,并且连续没有dicts 作为值。
  • 此键Return.ReturnData.IRS990PF在 PasteBin 数据示例中不可用。
    • 键中IRS990,只有IRS990IRS990Schedule...可用。
  • 另一种解压作为字典列表的值的方法是使用meta参数json_normalize
    • 请参阅此答案以获取一个很好的示例
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)

推荐阅读