如何将数据框中带有字典列表的 JSON 列取消嵌套到新的数据框中?

How do you unnest JSON, column with a list of dict in a dataframe to a new Dataframe?

我有一个数据框,df_object 有一列包含字典项列表。

ObjectID research
392 {'researchID': '10003', 'research.type': 'x-ray', 'research.date': '2004'}, {'researchID': '10006', 'research.type': 'document', 'research.date': '2005'
394 {'researchID': '10012', 'research.type': 'x-ray', 'research.date': '2005'}

我的目标是从研究栏中获得一个新的数据框,其中包含 ObjectID,但使用 researchID 作为索引:

researchID (index) ObjectID research.type research.date
10003 392 x-ray 2004
10006 392 document 2005
10012 394 x-ray 2005

当我使用此代码时:df = pd.DataFrame(df_object['research'][392]) 列是正确的,看起来像这样:

researchID (index) ObjectID research.type research.date
10003 392 x-ray 2004
10006 392 document 2005

问题是我不知道如何添加其余的 objectID 数据。我以为我可以迭代 df_object 中的所有行并附加这些行,但不确定这是否是最好的方法,因为我读到你不应该像那样将数百行附加到数据帧,因为它很慢。

当我尝试 df = pd.DataFrame(df_object['research']) 时,索引保留在 ObjectID 上并且是嵌套的。

我尝试了一些来自 Whosebug 的 flatten JSON 函数,但我一直收到错误,我不确定这是否是我需要搜索的。

已添加 输出自:df_object.head(2).to_dict()

{'research': {392: [{'researchID': '10003', 'research.type': ['x-ray'], 'research.date': '2004'},{'researchID': '10006', 'research.type': 'document', 'research.date': '2005'}], 393: {'researchID': '10012', 'research.type': 'x-ray', 'research.date': '2005'}} 

我假设在 research 列中您有字典项目列表(如您在问题中所述)。那么:

df = df.explode("research")
df = pd.concat([df, df.pop("research").apply(pd.Series)], axis=1)
print(df)

打印:

   ObjectID researchID research.type research.date
0       392      10003         x-ray          2004
0       392      10006      document          2005
1       394      10012         x-ray          2005

设置researchID为索引:

print(df.set_index("researchID"))

打印:

            ObjectID research.type research.date
researchID                                      
10003            392         x-ray          2004
10006            392      document          2005
10012            394         x-ray          2005