解析存储在列表中的多个JSON并构建 Dataframe

qvsjd97n  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(167)

我有这个JSON。它是一个API请求输出。(实际上是一个4个JSON的列表,存储在一个名为responselist的变量中)。目标是解析它并将其存储到一个 Dataframe 中,所以我的想法是循环到每个responselistresponse
JSON看起来像这样:

[{'pagination': {'limit': 100, 'offset': 0, 'count': 100, 'total': 286},
  'data': [{'flight_date': '2022-12-25',
    'flight_status': 'scheduled',
    'departure': {'airport': 'Marseille Provence Airport',
     'timezone': 'Europe/Paris',
     'iata': 'MRS',
     'icao': 'LFML',
     'terminal': '1B',
     'gate': None,
     'delay': None,
     'scheduled': '2022-12-25T16:00:00+00:00',
     'estimated': '2022-12-25T16:00:00+00:00',
     'actual': None,
     'estimated_runway': None,
     'actual_runway': None},
    'arrival': {'airport': 'Ste Catherine',
     'timezone': 'Europe/Paris',
     'iata': 'CLY',
     'icao': 'LFKC',
     'terminal': None,
     'gate': None,
     'baggage': None,
     'delay': None,
     'scheduled': '2022-12-25T17:00:00+00:00',
     'estimated': '2022-12-25T17:00:00+00:00',
     'actual': None,
     'estimated_runway': None,
     'actual_runway': None},
    'airline': {'name': 'Air Corsica', 'iata': 'XK', 'icao': 'CCM'},
    'flight': {'number': '351',
     'iata': 'XK351',
     'icao': 'CCM351',
     'codeshared': None},
    'aircraft': None,
    'live': None},
   {'flight_date': '2022-12-25',
    'flight_status': 'scheduled',
    'departure': {'airport': 'Marseille Provence Airport',
     'timezone': 'Europe/Paris',
     'iata': 'MRS',
     'icao': 'LFML',
     'terminal': '1B',
     'gate': None,
     'delay': 42,
     'scheduled': '2022-12-25T10:50:00+00:00',
     'estimated': '2022-12-25T10:50:00+00:00',
     'actual': '2022-12-25T11:31:00+00:00',
     'estimated_runway': '2022-12-25T11:31:00+00:00',
     'actual_runway': '2022-12-25T11:31:00+00:00'},
    'arrival': {'airport': 'Campo Dell Oro',
     'timezone': 'Europe/Paris',
     'iata': 'AJA',
     'icao': 'LFKJ',
     'terminal': '2',
     'gate': None,
     'baggage': None,
     'delay': 23,
     'scheduled': '2022-12-25T11:55:00+00:00',
     'estimated': '2022-12-25T11:55:00+00:00',
     'actual': None,
     'estimated_runway': None,
     'actual_runway': None},
    'airline': {'name': 'Air Corsica', 'iata': 'XK', 'icao': 'CCM'},
    'flight': {'number': '151',
     'iata': 'XK151',
     'icao': 'CCM151',
     'codeshared': None},
    'aircraft': None,
    'live': None},
[...]
}]}

下面的代码用于将departure节点存储到一列 Dataframe 中:

for response in responselist:  
  data.extend(
      flight_data.get('departure').get('airport')
      for flight_data in response.get('data')

  cols=['departures']

result = pd.DataFrame(data, columns=cols)
result

我们的想法是解析JSON的其他节点来完成 Dataframe 。我认为这应该将timezone节点存储到第二列中,但它返回invalid syntax

for response in responselist:  
  data.extend(
      flight_data.get('departure').get('airport')
      for flight_data in response.get('data')
  data.extend(
     flight_data.get('departure').get('timezone')
     for flight_data in response.get('data')
  
  cols=['departures', 'timezone']

result = pd.DataFrame(data, columns=cols)
result
iezvtpos

iezvtpos1#

它抛出了无效语法,因为缩进大小不同,并且for循环没有用:闭合。这修复了这些问题,但仍然不是您所寻找的。

for response in responselist:  
  data.extend(flight_data.get('departure').get('airport')

  for flight_data in response.get('data'):
    data.extend(flight_data.get('departure').get('timezone')

  for flight_data in response.get('data'):
    cols=['departures', 'timezone']

正如@tomerar所提到的,利用json_normalize()来代替for循环,会更高效:

df = pd.json_normalize(responselist[0]['data'])

相关问题