我正在使用带有嵌套列表和嵌套字典的列表和字典。我想将它们压平成一个数据框。
我想做的大学作业是创建一个有关橄榄球比赛中球员统计数据的数据框。我正在寻找一些易于重复的代码,当我为 N 个匹配调用 api 时,我可以使用它们来增长数据帧或列表。
我有:
我想要:
理想情况下,我想要一种有效的方法来使用“优雅”的代码来实现这一目标。我尝试过(循环失败):
pd.json_normalize(results['home']['teamsheet'], sep = '_')
这对于两个团队的团队表都很有效。另外我想做的是将相同的匹配数据添加到 DF 中的每一行。
我想最终得到这样的结果,但比赛中每个玩家一行,并且此数据超过许多(250+)场比赛:
当我为 x 提供一个值时,这才起作用。我一直无法找出循环。也许循环不是我需要的,但这似乎是可行的方法。
我的数据:
目标df:
df = [['id', 'comp_id', 'comp_name', 'season', 'status', 'match_minute', 'venue', 'game_week', 'home_team', 'away_team',
'home_id', 'away_id', 'date', 'home_score', 'away_score', 'home_tries', 'away_tries', 'home_conversions', 'away_conversions',
'home_penalties', 'away_penalties', 'home_drop_goals', 'away_drop_goals', 'round_id', 'stage', 'updated', 'player_id',
'name', 'position', 'substitute', 'tries', 'tackles', 'missed_conversion_goals', 'dominant_tackles', 'penalties_conceded',
'rucks_won', 'tackle_success', 'defenders_beaten', 'offload', 'drop_goals_converted', 'runs', 'metres', 'missed_penalty_goals',
'points', 'conversion_goals', 'try_assists', 'drop_goal_missed', 'lineouts_won', 'missed_tackles', 'penalty_goals',
'passes', 'bad_passes', 'turnovers_conceded', 'rucks_lost', 'clean_breaks', 'team']]
df = pd.DataFrame(df)
df.columns = df.iloc[0]
df = df[1:]
匹配数据:
{'id': 3195835,
'comp_id': 2142,
'comp_name': 'Super Rugby Aotearoa',
'season': '2020',
'status': 'Result',
'match_minute': 80,
'venue': 'Orangetheory Stadium',
'game_week': 9,
'home_team': 'Crusaders',
'away_team': 'Highlanders',
'home_id': 305,
'away_id': 302,
'date': '2020-08-09T03:35:00+00:00',
'home_score': 32,
'away_score': 22,
'home_tries': 4,
'away_tries': 3,
'home_conversions': 3,
'away_conversions': 2,
'home_penalties': 2,
'away_penalties': 1,
'home_drop_goals': 0,
'away_drop_goals': 0,
'round_id': 9,
'stage': 'Regular Season',
'updated': '2024-02-09T16:05:35+00:00',
'player_id': 156702,
'name': 'Sevu Reece',
'position': 14,
'substitute': False,
'tries': '0',
'tackles': '4',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.57',
'defenders_beaten': '8',
'offload': '1',
'drop_goals_converted': '0',
'runs': '10',
'metres': '104',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '1',
'missed_tackles': '3',
'penalty_goals': '0',
'passes': '6',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '2',
'team': 'home'}
球队数据(客队数据或多或少相同)
[{'player_id': 168972,
'name': 'Will Jordan',
'position': 15,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '3',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '1.00',
'defenders_beaten': '3',
'offload': '0',
'drop_goals_converted': '0',
'runs': '14',
'metres': '118',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '2',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '10',
'bad_passes': '1',
'turnovers_conceded': '3',
'rucks_lost': '0',
'clean_breaks': '2'}},
{'player_id': 156702,
'name': 'Sevu Reece',
'position': 14,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '4',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.57',
'defenders_beaten': '8',
'offload': '1',
'drop_goals_converted': '0',
'runs': '10',
'metres': '104',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '1',
'missed_tackles': '3',
'penalty_goals': '0',
'passes': '6',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '2'}},
{'player_id': 168960,
'name': 'Braydon Ennor',
'position': 13,
'substitute': False,
'match_stats': {'tries': '1',
'tackles': '9',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.82',
'defenders_beaten': '3',
'offload': '1',
'drop_goals_converted': '0',
'runs': '8',
'metres': '32',
'missed_penalty_goals': '0',
'points': '5',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '2',
'penalty_goals': '0',
'passes': '2',
'bad_passes': '0',
'turnovers_conceded': '2',
'rucks_lost': '0',
'clean_breaks': '3'}},
{'player_id': 133770,
'name': 'Jack Goodhue',
'position': 12,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '10',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.77',
'defenders_beaten': '3',
'offload': '2',
'drop_goals_converted': '0',
'runs': '13',
'metres': '49',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '3',
'penalty_goals': '0',
'passes': '15',
'bad_passes': '0',
'turnovers_conceded': '2',
'rucks_lost': '0',
'clean_breaks': '2'}},
{'player_id': 140028,
'name': 'George Bridge',
'position': 11,
'substitute': False,
'match_stats': {'tries': '2',
'tackles': '5',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '1.00',
'defenders_beaten': '2',
'offload': '1',
'drop_goals_converted': '0',
'runs': '9',
'metres': '43',
'missed_penalty_goals': '0',
'points': '10',
'conversion_goals': '0',
'try_assists': '1',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '4',
'bad_passes': '0',
'turnovers_conceded': '2',
'rucks_lost': '0',
'clean_breaks': '3'}},
{'player_id': 126474,
'name': "Richie Mo'unga",
'position': 10,
'substitute': False,
'match_stats': {'tries': '1',
'tackles': '9',
'missed_conversion_goals': '1',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.82',
'defenders_beaten': '1',
'offload': '2',
'drop_goals_converted': '0',
'runs': '12',
'metres': '94',
'missed_penalty_goals': '0',
'points': '17',
'conversion_goals': '3',
'try_assists': '1',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '2',
'penalty_goals': '2',
'passes': '28',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '3'}},
{'player_id': 118824,
'name': 'Bryn Hall',
'position': 9,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '1',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.33',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '7',
'metres': '34',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '2',
'penalty_goals': '0',
'passes': '43',
'bad_passes': '0',
'turnovers_conceded': '1',
'rucks_lost': '0',
'clean_breaks': '3'}},
{'player_id': 115806,
'name': 'Joe Moody',
'position': 1,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '4',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '1.00',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '1',
'metres': '2',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '0',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 112860,
'name': 'Codie Taylor',
'position': 2,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '10',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '1.00',
'defenders_beaten': '1',
'offload': '2',
'drop_goals_converted': '0',
'runs': '9',
'metres': '68',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '7',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '7',
'bad_passes': '0',
'turnovers_conceded': '1',
'rucks_lost': '0',
'clean_breaks': '2'}},
{'player_id': 132000,
'name': 'Michael Alaalatoa',
'position': 3,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '8',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.80',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '4',
'metres': '6',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '2',
'penalty_goals': '0',
'passes': '1',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 62526,
'name': 'Sam Whitelock',
'position': 4,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '10',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.91',
'defenders_beaten': '0',
'offload': '2',
'drop_goals_converted': '0',
'runs': '4',
'metres': '2',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '1',
'penalty_goals': '0',
'passes': '6',
'bad_passes': '1',
'turnovers_conceded': '1',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 149664,
'name': 'Quinten Strange',
'position': 5,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '3',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '3',
'rucks_won': '0',
'tackle_success': '0.50',
'defenders_beaten': '1',
'offload': '0',
'drop_goals_converted': '0',
'runs': '4',
'metres': '6',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '3',
'penalty_goals': '0',
'passes': '0',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 130416,
'name': 'Tom Sanders',
'position': 6,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '5',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.71',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '3',
'metres': '0',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '2',
'penalty_goals': '0',
'passes': '0',
'bad_passes': '0',
'turnovers_conceded': '1',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 165000,
'name': 'Tom Christie',
'position': 7,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '13',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.87',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '7',
'metres': '15',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '2',
'penalty_goals': '0',
'passes': '3',
'bad_passes': '0',
'turnovers_conceded': '1',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 126444,
'name': 'Whetu Douglas',
'position': 8,
'substitute': False,
'match_stats': {'tries': '0',
'tackles': '10',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.83',
'defenders_beaten': '1',
'offload': '3',
'drop_goals_converted': '0',
'runs': '15',
'metres': '23',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '2',
'penalty_goals': '0',
'passes': '7',
'bad_passes': '1',
'turnovers_conceded': '2',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 157056,
'name': 'Andrew Makalio',
'position': 16,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '4',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '1',
'rucks_won': '0',
'tackle_success': '0.67',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '2',
'metres': '6',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '6',
'missed_tackles': '2',
'penalty_goals': '0',
'passes': '0',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 134226,
'name': 'George Bower',
'position': 17,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '8',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.62',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '6',
'metres': '5',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '5',
'penalty_goals': '0',
'passes': '2',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 147540,
'name': 'Oli Jager',
'position': 18,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '0',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.00',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '0',
'metres': '0',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '0',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 62514,
'name': 'Luke Romano',
'position': 19,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '4',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '1.00',
'defenders_beaten': '0',
'offload': '1',
'drop_goals_converted': '0',
'runs': '3',
'metres': '6',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '1',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 175506,
'name': 'Sione Havili',
'position': 20,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '2',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.67',
'defenders_beaten': '2',
'offload': '1',
'drop_goals_converted': '0',
'runs': '4',
'metres': '30',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '1',
'penalty_goals': '0',
'passes': '1',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '1'}},
{'player_id': 126342,
'name': 'Mitchell Drummond',
'position': 21,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '2',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '1.00',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '3',
'metres': '5',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '32',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 173526,
'name': 'Brett Cameron',
'position': 22,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '0',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '0.00',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '0',
'metres': '0',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '0',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}},
{'player_id': 184710,
'name': "Leicester Fainga'anuku",
'position': 23,
'substitute': True,
'match_stats': {'tries': '0',
'tackles': '1',
'missed_conversion_goals': '0',
'dominant_tackles': '0',
'penalties_conceded': '0',
'rucks_won': '0',
'tackle_success': '1.00',
'defenders_beaten': '0',
'offload': '0',
'drop_goals_converted': '0',
'runs': '0',
'metres': '0',
'missed_penalty_goals': '0',
'points': '0',
'conversion_goals': '0',
'try_assists': '0',
'drop_goal_missed': '0',
'lineouts_won': '0',
'missed_tackles': '0',
'penalty_goals': '0',
'passes': '0',
'bad_passes': '0',
'turnovers_conceded': '0',
'rucks_lost': '0',
'clean_breaks': '0'}}]
我明白了:
resultList = list(results['match'].items())
for i in results['home']['teamsheet']:
i.update(resultList)
df = pd.json_normalize(results['home']['teamsheet'], sep = '_')
完成。
干杯!希望这对处于我的情况的其他人有所帮助。