Python 有没有更好的方法将JSON转换为数据帧?
要将JSON对象转换为数据帧 这是我的JSON对象Python 有没有更好的方法将JSON转换为数据帧?,python,json,pandas,Python,Json,Pandas,要将JSON对象转换为数据帧 这是我的JSON对象 data = {'situation': {'OpenPlay': {'shots': 282, 'goals': 33, 'xG': 36.38206055667251, 'against': {'shots': 276, 'goals': 29, 'xG': 33.0840025995858}}, 'FromCorner': {'shots': 46, 'goals': 2, 'xG': 2.8616137
data = {'situation': {'OpenPlay': {'shots': 282,
'goals': 33,
'xG': 36.38206055667251,
'against': {'shots': 276, 'goals': 29, 'xG': 33.0840025995858}},
'FromCorner': {'shots': 46,
'goals': 2,
'xG': 2.861613758839667,
'against': {'shots': 46, 'goals': 4, 'xG': 3.420699148438871}},
'DirectFreekick': {'shots': 19,
'goals': 1,
'xG': 1.0674087516963482,
'against': {'shots': 10, 'goals': 0, 'xG': 0.6329493299126625}},
'SetPiece': {'shots': 14,
'goals': 1,
'xG': 0.6052199145779014,
'against': {'shots': 21, 'goals': 1, 'xG': 2.118571280501783}},
'Penalty': {'shots': 6,
'goals': 6,
'xG': 4.5670130252838135,
'against': {'shots': 2, 'goals': 1, 'xG': 1.5222634673118591}}}
想要输出:
我的代码:
df = pd.json_normalize(data['situation']['OpenPlay'])
for i in range(1,4):
df = df.append(pd.json_normalize(data['situation'][type_of_play[i]]))
df = df.reset_index()
有什么有效的方法吗?您可以定期将数据加载到数据帧中,然后在包含剩余DICT的列上运行json_normalize,并将其与主数据帧连接:
df = pd.DataFrame(data['situation']).T.reset_index()
df = df.join(pd.json_normalize(df.against), lsuffix='_against', how='left').drop(columns=['against'])
结果:
指数
枪杀
你的目标是什么
xG_反对
镜头
目标
xG
0
开放游戏
282
33
36.3821
276
29
33.084
1.
从角落
46
2.
2.86161
46
4.
3.4207
2.
直接任意球
19
1.
1.06741
10
0
0.632949
3.
定位球
14
1.
0.60522
21
1.
2.11857
4.
处罚
6.
6.
4.56701
2.
1.
1.52226
您可以定期将数据加载到数据帧中,然后在包含剩余dict的列上运行json_normalize,并将其与主数据帧连接:
df = pd.DataFrame(data['situation']).T.reset_index()
df = df.join(pd.json_normalize(df.against), lsuffix='_against', how='left').drop(columns=['against'])
结果:
指数
枪杀
你的目标是什么
xG_反对
镜头
目标
xG
0
开放游戏
282
33
36.3821
276
29
33.084
1.
从角落
46
2.
2.86161
46
4.
3.4207
2.
直接任意球
19
1.
1.06741
10
0
0.632949
3.
定位球
14
1.
0.60522
21
1.
2.11857
4.
处罚
6.
6.
4.56701
2.
1.
1.52226
首先,您的数据末尾缺少“}”。 请尝试以下代码:
obj = [pd.json_normalize(data['situation'][e]) for e in data['situation']]
pd.concat(obj, ignore_index=True)
首先,您的数据末尾缺少“}”。 请尝试以下代码:
obj = [pd.json_normalize(data['situation'][e]) for e in data['situation']]
pd.concat(obj, ignore_index=True)
为了提高效率,最好在字典外部处理数据,然后创建数据帧 在将数据传递给熊猫之前,可以使用提取数据;应该提高效率;您可以运行测试来检查速度: 总结思想;如果要访问键,请使用。如果是数组/列表,请使用[]: 可以很方便,尤其是当dict/json中的嵌套变得更加复杂时;但是,最有效的方法是直接使用字典数据结构:
from collections import defaultdict
df = defaultdict(list)
for key, value in data['situation'].items():
df['shots'].append(value['shots'])
df['goals'].append(value['goals'])
df['xG'].append(value['xG'])
df['against_shots'].append(value['against']['shots'])
df['against_goals'].append(value['against']['goals'])
df['against_xG'].append(value['against']['xG'])
# create dataframe
pd.DataFrame(df)
shots goals xG against_shots against_goals against_xG
0 282 33 36.382061 276 29 33.084003
1 46 2 2.861614 46 4 3.420699
2 19 1 1.067409 10 0 0.632949
3 14 1 0.605220 21 1 2.118571
4 6 6 4.567013 2 1 1.522263
为了提高效率,最好在字典外部处理数据,然后创建数据帧 在将数据传递给熊猫之前,可以使用提取数据;应该提高效率;您可以运行测试来检查速度: 总结思想;如果要访问键,请使用。如果是数组/列表,请使用[]: 可以很方便,尤其是当dict/json中的嵌套变得更加复杂时;但是,最有效的方法是直接使用字典数据结构:
from collections import defaultdict
df = defaultdict(list)
for key, value in data['situation'].items():
df['shots'].append(value['shots'])
df['goals'].append(value['goals'])
df['xG'].append(value['xG'])
df['against_shots'].append(value['against']['shots'])
df['against_goals'].append(value['against']['goals'])
df['against_xG'].append(value['against']['xG'])
# create dataframe
pd.DataFrame(df)
shots goals xG against_shots against_goals against_xG
0 282 33 36.382061 276 29 33.084003
1 46 2 2.861614 46 4 3.420699
2 19 1 1.067409 10 0 0.632949
3 14 1 0.605220 21 1 2.118571
4 6 6 4.567013 2 1 1.522263
如果有很多迭代,可以创建每个规范化df的列表,然后对数据帧列表进行压缩。在每次迭代中追加会耗费更多的时间。如果有很多迭代,可以创建每个规范化df的列表,然后在数据帧列表中添加。在每次迭代中追加更多的时间consuming@sammywemmy我今天刚刚注册了这个帐户,在帖子中嵌入图片需要10个声誉,我当时没有10个声誉,我只能链接图片。@sammywemmy不,我不知道。即使我知道,我也无法更改系统设置,我必须获得足够的声誉,以便我可以放置图像而不是链接。我也觉得这个环境让我很不舒服。请不要这样想,我从来没想过你在批评我。我希望我们能互相学习技术。如果我有任何冒犯,请原谅我。@sammywemmy我今天刚刚注册了这个帐户,在帖子中嵌入图像需要10个声誉,我当时没有10个声誉,我只能链接图像。@sammywemmy不,我不知道。即使我知道,我也无法更改系统设置,我必须获得足够的声誉,以便我可以放置图像而不是链接。我也觉得这个环境让我很不舒服。请不要这样想,我从来没想过你在批评我。我希望我们能互相学习技术。如果我有任何冒犯,请原谅我。