Пустой pandas фрейм данных из JSON - PullRequest
1 голос
/ 19 июня 2020

Я в тупике, пытаясь вывести этот JSON файл во фрейм данных. Я могу видеть содержимое JSON, распечатанное на экране, но когда я пытаюсь загрузить его в фрейм данных, результат оказывается пустым. Любые советы с удовольствием оценят. Результат, который я ищу, показан на картинке: df first few rows

        import json
        from urllib.request import urlopen
        import pandas as pd

        with urlopen('https://statdata.pgatour.com/r/021/2020/player_stats.json') as response:
            source = response.read()

        data = json.loads(source)
        tid = data['tournament']['tournamentNumber']

        for item in data['tournament']['players']:
            try:
                pid = item['pid']
                stats = item['stats']
                for stat in stats:
                    statId = stat['statId']
                    name = stat['name']
                    tValue = stat['tValue']
                    print(tid, pid, statId, name, tValue)
            except Exception as e:
                print(e)
                print(item)
                break 

df = pd.DataFrame (data, columns = ['tid', 'pid', 'statId', 'name', 'tValue'])
print(df)

Ответы [ 3 ]

1 голос
/ 19 июня 2020

IIU C json_normalize

работает после вашей source переменной.

если вы посмотрите в rounds, вы увидите разные значения для каждого statId.

json_obj = json.loads(source)
df = pd.json_normalize(json_obj,record_path=['tournament','players'])
df1 = df.explode('stats')
df1 = df1.join(pd.json_normalize(df1['stats'])).drop('stats',1)

print(df1.drop('rounds',1))

        pid             pn statId             name tValue rank rankAll cValue
0     40026  Daniel Berger    106           Eagles      0  T15     T18       
1     40026  Daniel Berger    106           Eagles      0  T15     T18       
2     40026  Daniel Berger    106           Eagles      0  T15     T18       
3     40026  Daniel Berger    106           Eagles      0  T15     T18       
4     40026  Daniel Berger    106           Eagles      0  T15     T18       
...     ...            ...    ...              ...    ...  ...     ...    ...
3695  01378    David Frost  02567  SG: Off-the-Tee  4.960    2       2       
3696  01378    David Frost  02567  SG: Off-the-Tee  4.960    2       2       
3697  01378    David Frost  02567  SG: Off-the-Tee  4.960    2       2       
3698  01378    David Frost  02567  SG: Off-the-Tee  4.960    2       2       
3699  01378    David Frost  02567  SG: Off-the-Tee  4.960    2       2       

[3700 rows x 8 columns]
1 голос
/ 19 июня 2020

Вы можете сделать то же самое, используя json_normalize:

with urlopen('https://statdata.pgatour.com/r/021/2020/player_stats.json') as response:
    source = response.read()

data = json.loads(source)
df = pd.json_normalize(data,
                       record_path=['tournament', 'players', 'stats'],
                       meta=[['tournament', 'tournamentNumber'],
                       ['tournament', 'players', 'pid']])
print(df[['statId', 'name', 'tournament.players.pid', 'tournament.tournamentNumber', 'tValue']])


     statId                    name tournament.players.pid tournament.tournamentNumber   tValue
0       106                  Eagles                  40026                         021        0
1       107                 Birdies                  40026                         021       22
2       523                    Pars                  40026                         021       44
3       184                  Bogeys                  40026                         021        5
4       520                 Doubles                  40026                         021        1
...     ...                     ...                    ...                         ...      ...
3695  02569    SG: Around-the-Green                  01378                         021   -1.131
3696  02568  SG: Approach-the-Green                  01378                         021   -8.661
3697  02567         SG: Off-the-Tee                  01378                         021   -6.391
3698  02674        SG: Tee-to-Green                  01378                         021  -16.183
3699  02675               SG: Total                  01378                         021  -15.432
1 голос
/ 19 июня 2020

Здесь вы go приятель, хотя вы читаете все данные, вы не сохраняете их в виде списка, вы все еще пытаетесь импортировать данные (как json) в фрейм данных, и это не сработает . Я создал несколько списков, чтобы вы могли сохранять значения по отдельности, а затем вставлять их в виде столбцов, пожалуйста, проверьте, правильно ли я понял проблему, под кодом.

import json
from urllib.request import urlopen
import pandas as pd

tid_list = []
pid_list = []
stats_list = []
stats_id_list = []
name_list = []
tValue_list = []
for n in range(20,22,1):
    if n < 10:
        week = '00'+str(n)
    else:
        week = '0'+str(n)

    with urlopen('https://statdata.pgatour.com/r/'+week+'/2020/player_stats.json') as response:
        source = response.read()

    data = json.loads(source)
    tid = data['tournament']['tournamentNumber']

    for item in data['tournament']['players']:
        try:
            pid = item['pid']
            tid_list.append(tid)
            pid_list.append(pid)
            stats = item['stats']
            i=0
            for stat in stats:
                if i > 0:
                    pid_list.append(pid)
                    tid_list.append(tid)
                statId = stat['statId']
                stats_id_list.append(statId)
                name = stat['name']
                name_list.append(name)
                tValue = stat['tValue']
                tValue_list.append(tValue)
                i+=1
                print(tid, pid, statId, name, tValue)
        except Exception as e:

            break

#print(data)
df = pd.DataFrame(data={'tid':tid_list,'pid':pid_list,'statsId':stats_id_list,'name':name_list,'tValue':tValue_list})#, columns = ['tid', 'pid', 'statId', 'name', 'tValue'])
print(df)

вывод:

      tid    pid statsId                    name   tValue
0     021  40026     106                  Eagles        0
1     021  40026     107                 Birdies       22
2     021  40026     523                    Pars       44
3     021  40026     184                  Bogeys        5
4     021  40026     520                 Doubles        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...