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

2024-04-26 04:19:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的数据帧中有json值,现在我想迭代它们,我尝试了几种方法,但都失败了。我曾尝试将dataframe值转换为嵌套字典,以便它们可以轻松地进行迭代,但我也失败了

在迭代完要保存的值之后,我要以展开的形式再次保存到数据帧中,这样我就可以得到所有的值

这就是我的字典的价值观

{
  ('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值,不管它是来自dictionary还是来自data frame


Tags: 数据textnamejson字典valuestatsruns
1条回答
网友
1楼 · 发布于 2024-04-26 04:19:13

好吧,你的json是无效的,因为{('1144986','1'): 'whatever'}不是有效的json,相反,它是一个非常复杂的python字典定义,包含列表和其他字典,幸运的是,pandas可以处理,但恐怕不是以一种优雅的方式。你知道吗

现在看魔术(对不起图片,文本表示不是信息性的):

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

相关问题 更多 >