如何从包含嵌套字典的字典创建Pandas Dataframe ?



我正在做一个项目,我从GraphQL API获得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'}}

如何创建一个Pandas Dataframe,使列是

placement |  id  |  name

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

pd.DataFrame()

的输出不像期望的那样,所以我试着查找解决方案,包括迭代字典中的项,但我没有成功。任何帮助都会很感激。谢谢你。

这里有一种方法,通过从第一个DataFrame中提取一个新的DataFrame并合并它:

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

您需要为pandas创建合适的字典来创建数据框架。我假设这里你有一个叫做字典的字典列表。

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)

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

由于json.loads()提供数据的方式,您无法遍历捕获所有字典的df_data1。为了按照需要修复字典的结构,我建议您执行以下操作,通过替换出现的"}{"用"}, {"包裹,用"[""]"包裹。假设j是json字符串,那么:

df_data1 = json.loads("[" + j.replace("}{", "}, {") + "]")
现在你的df_data1应该是这样的:
[{'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'}}]

现在你可以使用@Thomas Q solution:

df= pd.DataFrame([
{"placement": d["placement"], "id": d["entrant"]["id"], "name": d["entrant"]["name"]}
for d in df_data1
])
df
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

最新更新