如何从包含嵌套字典的字典创建数据帧?

2024-09-27 23:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从事一个项目,从GraphQLAPI获取JSON数据。收到数据后,我对数据使用json.loads(),然后访问所需的json部分,然后将其存储在包含另一个字典的字典中。字典是:

{'placement': 1, 'entrant': {'id': 8554498, 'name': 'Test'}}
{'placement': 2, 'entrant': {'id': 8559863, 'name': 'Test'}}
{'placement': 3, 'entrant': {'id': 8561463, 'name': 'Test'}}
{'placement': 4, 'entrant': {'id': 8559889, 'name': 'Test'}}
{'placement': 5, 'entrant': {'id': 8561608, 'name': 'Test'}}
{'placement': 5, 'entrant': {'id': 8560090, 'name': 'Test'}}
{'placement': 7, 'entrant': {'id': 8561639, 'name': 'Test'}}
{'placement': 7, 'entrant': {'id': 8561822, 'name': 'Test'}}
{'placement': 9, 'entrant': {'id': 8559993, 'name': 'Test'}}
{'placement': 9, 'entrant': {'id': 8561572, 'name': 'Test'}}

如何创建一个数据框,以便列

placement |  id  |  name

这些列下面的值是字典中与它们关联的值?如果我只使用

pd.DataFrame()

输出不符合预期,因此我尝试查找涉及迭代字典中的项的解决方案,但没有成功。任何帮助都将不胜感激。多谢各位


Tags: 数据项目nametestidjsondataframe字典
3条回答

您需要为熊猫创建适当的字典来创建数据帧。我假设这里有一个叫做字典的口述清单

pd.DataFrame(
    [
        {"placement": d["placement"], "id": d["entrant"]["id"], "name": d["entrant"]["name"]}
        for d in dictionaries
    ]
)

我会这样做,也许不是最优雅的解决方案,但它是有效的。我知道你有一份每一条格言的清单,因为你一条一条地按比例排列

dList = [{'placement': 1, 'entrant': {'id': 8554498, 'name': 'Test'}},
{'placement': 2, 'entrant': {'id': 8559863, 'name': 'Test'}},
{'placement': 3, 'entrant': {'id': 8561463, 'name': 'Test'}},
{'placement': 4, 'entrant': {'id': 8559889, 'name': 'Test'}},
{'placement': 5, 'entrant': {'id': 8561608, 'name': 'Test'}},
{'placement': 5, 'entrant': {'id': 8560090, 'name': 'Test'}},
{'placement': 7, 'entrant': {'id': 8561639, 'name': 'Test'}},
{'placement': 7, 'entrant': {'id': 8561822, 'name': 'Test'}},
{'placement': 9, 'entrant': {'id': 8559993, 'name': 'Test'}},
{'placement': 9, 'entrant': {'id': 8561572, 'name': 'Test'}}]


#generate column Names I supose that you dont have writed this names to make more general the problem
d0 = dList[0]
columns = []
for key,val in d0.items():
    if not isinstance(val,dict):
        columns.append(key)
    else:
        for subkey,subval in val.items():
            columns.append(subkey)

#%% Here we are going to generate de data list (a list with a sublist for every dict
data = []
for d in dList:
    thisData = []
    for key,val in d.items():
        if not isinstance(val,dict):
            thisData.append(val)
        else:
            for subkey,subval in val.items():
                thisData.append(subval)
    data.append(thisData)


df = pd.DataFrame(data,columns=columns)

希望它对你有用,如果不让我知道的话

下面是一种方法,从第一个数据帧中提取一个新的数据帧并合并它:

from itertools import chain

import pandas as pd

data = [
    [{"placement": 1, "entrant": {"id": 8554498, "name": "Test"}}],
    [{"placement": 2, "entrant": {"id": 8559863, "name": "Test"}}],
    [{"placement": 3, "entrant": {"id": 8561463, "name": "Test"}}],
    [{"placement": 4, "entrant": {"id": 8559889, "name": "Test"}}],
    [{"placement": 5, "entrant": {"id": 8561608, "name": "Test"}}],
    [{"placement": 5, "entrant": {"id": 8560090, "name": "Test"}}],
    [{"placement": 7, "entrant": {"id": 8561639, "name": "Test"}}],
    [{"placement": 7, "entrant": {"id": 8561822, "name": "Test"}}],
    [{"placement": 9, "entrant": {"id": 8559993, "name": "Test"}}],
    [{"placement": 9, "entrant": {"id": 8561572, "name": "Test"}}],
]

df = pd.DataFrame.from_dict(chain(*data))
result_df = pd.merge_asof(
    df.loc[:, df.columns != "entrant"],  # Get df without the "entrant" column
    df["entrant"].apply(pd.Series), left_index=True, right_index=True
)

结果如下:

   placement       id  name
0          1  8554498  Test
1          2  8559863  Test
2          3  8561463  Test
3          4  8559889  Test
4          5  8561608  Test
5          5  8560090  Test
6          7  8561639  Test
7          7  8561822  Test
8          9  8559993  Test
9          9  8561572  Test

相关问题 更多 >

    热门问题