如何在python中迭代多级数据框

时间:2018-12-10 15:28:46

标签: python json pandas dictionary

我的数据框内有json值,现在我想对其进行迭代,我尝试了几种方法,但都失败了。我试图将数据框值转换为嵌套字典,以便可以轻松地对其进行迭代,但是我也失败了

迭代值后,我想再次保存,以展开形式插入数据框,以便我可以获取所有值

这就是我的字典值

{
  ('1144986',
  '1'): {
    'batsmen': [
      {
        'name': 'NM Coulter-Nile',
        'stats': {
          'runs': {
            'name': 'runs',
            'text': 'RUNS',
            'value': '34'
          },
          'ballsFaced': {
            'name': 'ballsFaced',
            'text': 'BF',
            'value': '31'
          }
        }
      },
      {
        'name': 'AT Carey',
        'stats': {
          'runs': {
            'name': 'runs',
            'text': 'RUNS',
            'value': '33'
          },
          'ballsFaced': {
            'name': 'ballsFaced',
            'text': 'BF',
            'value': '71'
          }
        }
      }
    ],
    'bowlers': [
      {
        'name': 'DW Steyn',
        'stats': {
          'overs': {
            'name': 'overs',
            'text': 'O',
            'value': '7'
          },
          'wickets': {
            'name': 'wickets',
            'text': 'E',
            'value': '2'
          }
        }
      },
      {
        'name': 'AL Phehlukwayo',
        'stats': {
          'overs': {
            'name': 'overs',
            'text': 'O',
            'value': '6'
          },
          'wickets': {
            'name': 'wickets',
            'text': 'E',
            'value': '3'
          }
        }
      }
    ],
    'team': {
      'teamDisplayName': 'AUSTRALIA',
      'innDisplayName': 'INNINGS',
      'runs': 152,
      'overs': 38.1,
      'wickets': 10,
      'description': 'all out',
      'inningsRunWicket': 152,
      'inningStatus': ''
    }
  },
  ('1144986',
  '2'): {
    'batsmen': [
      {
        'name': 'RR Hendricks',
        'stats': {
          'runs': {
            'name': 'runs',
            'text': 'RUNS',
            'value': '44'
          },
          'ballsFaced': {
            'name': 'ballsFaced',
            'text': 'BF',
            'value': '74'
          }
        }
      },
      {
        'name': 'Q de Kock',
        'stats': {
          'runs': {
            'name': 'runs',
            'text': 'RUNS',
            'value': '47'
          },
          'ballsFaced': {
            'name': 'ballsFaced',
            'text': 'BF',
            'value': '40'
          }
        }
      }
    ],
    'bowlers': [
      {
        'name': 'NM Coulter-Nile',
        'stats': {
          'overs': {
            'name': 'overs',
            'text': 'O',
            'value': '3'
          },
          'wickets': {
            'name': 'wickets',
            'text': 'E',
            'value': '1'
          }
        }
      },
      {
        'name': 'MP Stoinis',
        'stats': {
          'overs': {
            'name': 'overs',
            'text': 'O',
            'value': '4.2'
          },
          'wickets': {
            'name': 'wickets',
            'text': 'E',
            'value': '3'
          }
        }
      }
    ],
    'team': {
      'teamDisplayName': 'SOUTH AFRICA',
      'innDisplayName': 'INNINGS',
      'runs': 153,
      'overs': 29.2,
      'wickets': 4,
      'description': 'target reached',
      'inningsRunWicket': '153/4',
      'inningStatus': ''
    }
  }
}

如果有人可以提供有关数据框的帮助,他也可以这样做,我还要粘贴图像以供数据框参考。

这就是我的数据框

enter image description here

我只想遍历json值,无论它是来自字典还是来自数据帧

1 个答案:

答案 0 :(得分:2)

好的,您的json无效,因为{('1144986','1'): 'whatever'}不是有效的json,相反,它是一个极其复杂的python字典定义,包含列表和其他字典,幸运的是,熊猫可以处理但我无法以优美的方式处理我害怕。

现在观看魔术(很抱歉,图像,文字表示不提供信息):

js_dict = {('1144986','1'):{'batsmen'  ... # this line won't execute, just for completeness

# Get the initial dataframe
df = pd.DataFrame.from_dict(js_dict, orient='index')

看起来像 enter image description here

现在,让我们照顾球队,板球运动员和投球手。


团队

teams = pd.concat(df['team'].apply(pd.DataFrame.from_dict, orient='index')
                  .apply(lambda x: x.T)
                  .to_dict()).reset_index(level=2,drop=True)

enter image description here

# Join back to the initial dataframe
df = df.join(teams).drop('team', axis=1)

蝙蝠侠

batsmen = pd.concat(df['batsmen']
                .apply(pd.DataFrame)
                .to_dict()).reset_index(level=2,drop=True)

enter image description here

# Join with the initial dataframe renaming some columns in the process
batsmen = batsmen.join(df).drop(['batsmen', 'bowlers'], axis=1)
batsmen = batsmen.rename(columns={'name': 'batsman_name',
                              'stats': 'batsman_stats'})

统计数据

batsman_stats = pd.concat(batsmen['batsman_stats']
                          .apply(pd.DataFrame)
                          .apply(lambda x: x.T).to_dict()).reset_index(level=2, drop=True)

# Join back with some renamings
batsmen = batsman_stats.join(batsmen).drop('batsman_stats', axis=1)
batsmen = batsmen.rename(columns={'name': 'batsman_stats_name',
                                  'text': 'batsman_stats_text',
                                  'value': 'batsman_stats_value'})

enter image description here


保龄球

bowlers = pd.concat(df['bowlers']
                .apply(pd.DataFrame)
                .to_dict()).reset_index(level=2,drop=True)

# Join with the initial dataframe renaming some columns in the process
bowlers = bowlers.join(df).drop(['batsmen', 'bowlers'], axis=1)
bowlers = bowlers.rename(columns={'name': 'bowler_name',
                                  'stats': 'bowler_stats'})

enter image description here

统计数据

bowler_stats = pd.concat(df['bowler_stats']
                         .apply(pd.DataFrame)
                         .apply(lambda x: x.T)
                         .to_dict()).reset_index(level=2, drop=True)

# Merge back and rename
bowlers = bowler_stats.join(bowlers).drop('bowler_stats', axis=1)
bowlers = bowlers.rename(columns={'name': 'bowler_stats_name',
                        'text': 'bowler_stats_text',
                        'value': 'bowler_stats_value'})

enter image description here