【问题标题】:Looping through dictionaries within a list and add row to DataFrame遍历列表中的字典并将行添加到 DataFrame
【发布时间】:2020-05-10 13:32:51
【问题描述】:

我有一个我试图从嵌套在另一个列表中的字典中解压缩的项目列表。

然后我想将该行添加到 DataFrame。

headers = ['minutesPlayed', 'goals', 'goalsAssist', 'shotsOnTarget',
           'shotsOffTarget', 'shotsBlocked', 'hitWoodwork', 'totalContest', 
           'penaltyMiss', 'penaltyWon', 'bigChanceMissed'] 

Python Variables

我试过的代码是:

rows = []
for groups in data['groups']:
    row = []

    #Summary
    row.append(groups['minutesPlayed'])
    row.append(groups['goals'])
    row.append(groups['goalAssist'])

    #Attack
    row.append(groups['shotsOnTarget'])
    row.append(groups['shotsOffTarget'])
    row.append(groups['shotsBlocked'])
    row.append(groups['hitWoodwork'])
    row.append(groups['totalContest'])
    row.append(groups['penaltyMiss'])
    row.append(groups['penaltyWon'])
    row.append(groups['bigChanceMissed'])
    rows.append(row)

df = pd.DataFrame(rows, columns=headers)

但是我收到错误:

KeyError: 'shotsOnTarget' 

它不允许我遍历组列表中的第二个元素。

有什么建议吗?

编辑添加打印数据[组]:

print(data['groups'])
[{'minutesPlayed': "89'", 'goals': '0', 'goalAssist': '1', 'statisticsItems': [{'minutesPlayed': 'Minutes played'}, {'goals': 'Goals'}, {'goalAssist': 'Assists'}], 'groupName': 'Summary'}, {'shotsOnTarget': '0', 'shotsOffTarget': '0', 'shotsBlocked': '1', 'hitWoodwork': '0', 'totalContest': '1 (0)', 'goals': '0', 'goalAssist': '1', 'penaltyMiss': '0', 'penaltyWon': '0', 'bigChanceMissed': '0', 'statisticsItems': [{'shotsOnTarget': 'Shots on target'}, {'shotsOffTarget': 'Shots off target'}, {'shotsBlocked': 'Shots blocked'}, {'totalContest': 'Dribble attempts (succ.)'}], 'groupName': 'Attack'}, {'touches': 55, 'accuratePass': '26 (70.3%)', 'keyPass': '1', 'totalCross': '0 (0)', 'totalLongBalls': '2 (0)', 'bigChanceCreated': '0', 'statisticsItems': [{'touches': 'Touches'}, {'accuratePass': 'Passes (acc.)'}, {'keyPass': 'Key passes'}, {'totalCross': 'Crosses (acc.)'}, {'totalLongBalls': 'Long balls (acc.)'}], 'groupName': 'Passing'}, {'possessionLost': '26', 'groundDuels': '9 (0)', 'aerialDuels': '3 (1)', 'wasFouled': '0', 'fouls': '2', 'offsides': '0', 'statisticsItems': [{'groundDuels': 'Ground duels (won)'}, {'aerialDuels': 'Aerial duels (won)'}, {'possessionLost': 'Possession lost'}, {'fouls': 'Fouls'}, {'wasFouled': 'Was fouled'}], 'groupName': 'Other'}, {'totalClearance': '0', 'clearanceOffLine': '0', 'blockedScoringAttempt': '0', 'interceptionWon': '0', 'totalTackle': '0', 'challengeLost': '1', 'lastManTackle': '0', 'errorLeadToShot': '0', 'errorLeadToGoal': '0', 'ownGoals': '0', 'penaltyConceded': '0', 'statisticsItems': [{'totalClearance': 'Clearances'}, {'blockedScoringAttempt': 'Blocked shots'}, {'interceptionWon': 'Interceptions'}, {'totalTackle': 'Tackles'}, {'challengeLost': 'Dribbled past'}], 'groupName': 'Defence'}]

【问题讨论】:

  • 'shotsOnTarget' 是第二个元素,只能在循环的第二次迭代中访问。
  • 您好 Austin,感谢您的快速回复,您将如何访问循环中的第二次迭代?
  • @SunilChavda headers list 有什么作用吗?
  • @shivank98 是的,我正在为我的 DataFrame 中的列名使用标题列表
  • @SunilChavda 你能把data['groups']打印出来吗?我没有从图像中得到什么

标签: python loops dictionary


【解决方案1】:

您的data['groups'] 是一个列表。其元素现在是字典,您的 minutesPlayedgoalsgoalAssist 位于列表的第一个元素中,因此当您的 for 循环中的 groupsvariable 运行但您的 shotsOnTarget 和其他人在时,它们将被调用第二个元素。可以遵循一种更好的方法。你不需要 for 循环。

#Summary
row.append(data['groups'][0]['minutesPlayed'])
row.append(data['groups'][0]['goals'])
row.append(data['groups'][0]['goalAssist'])

#Attact
row.append(data['groups'][1]['shotsOnTarget'])
# same for others,

【讨论】:

  • 感谢您的回答,因此该解决方案部分有效,但由于组的元素可能会发生变化,因此并未捕获所有内容。例如,data['groups'][1]['shotsOnTarget'] 可以更改为 data['groups'][5]['shotsOnTarget'] - 包含在第 5 个元素中。我相信这就是为什么我认为循环可能是个好主意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 2019-07-15
相关资源
最近更新 更多