如何将数据框中带有字典列表的 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
我有一个数据框,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