Python 有没有更好的方法将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

要将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.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不,我不知道。即使我知道,我也无法更改系统设置,我必须获得足够的声誉,以便我可以放置图像而不是链接。我也觉得这个环境让我很不舒服。请不要这样想,我从来没想过你在批评我。我希望我们能互相学习技术。如果我有任何冒犯,请原谅我。