Как перебрать многоуровневый фрейм данных в python - PullRequest
0 голосов
/ 10 декабря 2018

В моем фрейме данных есть значения 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 голосов
/ 10 декабря 2018

Хорошо, ваш 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...