2016-11-14 3 views
3

Мне интересно, как я могу использовать панда, чтобы прочитать вложенную JSON следующей структуры:Панды прочитать вложенную JSON

{ 
    "number": "", 
    "date": "01.10.2016", 
    "name": "R 3932", 
    "locations": [ 
     { 
      "depTimeDiffMin": "0", 
      "name": "Spital am Pyhrn Bahnhof", 
      "arrTime": "", 
      "depTime": "06:32", 
      "platform": "2", 
      "stationIdx": "0", 
      "arrTimeDiffMin": "", 
      "track": "R 3932" 
     }, 
     { 
      "depTimeDiffMin": "0", 
      "name": "Windischgarsten Bahnhof", 
      "arrTime": "06:37", 
      "depTime": "06:40", 
      "platform": "2", 
      "stationIdx": "1", 
      "arrTimeDiffMin": "1", 
      "track": "" 
     }, 
     { 
      "depTimeDiffMin": "", 
      "name": "Linz/Donau Hbf", 
      "arrTime": "08:24", 
      "depTime": "", 
      "platform": "1A-B", 
      "stationIdx": "22", 
      "arrTimeDiffMin": "1", 
      "track": "" 
     } 
    ] 
} 

Это здесь держит массив как JSON. Я предпочел бы, чтобы он был расширен в столбцы.

pd.read_json("/myJson.json", orient='records') 

редактировать

Спасибо за первые ответы. Я должен уточнить свой вопрос: Сглаживание вложенных атрибутов в массиве не является обязательным. Было бы нормально только [A, B, C] объединить df.locations ['name'].

Мой файл содержит несколько объектов JSON (по одному в строке) Я хотел бы сохранить номер, дату, имя и местоположение. Однако мне нужно будет присоединиться к местам.

allLocations = "" 
isFirst = True 
for location in result.locations: 
    if isFirst: 
     isFirst = False 
     allLocations = location['name'] 
    else: 
     allLocations += "; " + location['name'] 
allLocations 

Мой подход здесь не кажется эффективным/панд-стиль.

+0

Upvote для ÖBB –

ответ

9

Вы можете использовать json_normalize:

import json 
from pandas.io.json import json_normalize  

with open('myJson.json') as data_file:  
    data = json.load(data_file) 

df = json_normalize(data, 'locations', ['date', 'number', 'name'], 
        record_prefix='locations_') 
print (df) 
    locations_arrTime locations_arrTimeDiffMin locations_depTime \ 
0              06:32 
1    06:37      1    06:40 
2    08:24      1      

    locations_depTimeDiffMin   locations_name locations_platform \ 
0      0 Spital am Pyhrn Bahnhof     2 
1      0 Windischgarsten Bahnhof     2 
2         Linz/Donau Hbf    1A-B 

    locations_stationIdx locations_track number name  date 
0     0   R 3932   R 3932 01.10.2016 
1     1       R 3932 01.10.2016 
2     22       R 3932 01.10.2016 

EDIT:

Вы можете использовать read_json с разбора name по DataFrame конструктору и последний groupby с применить join:

df = pd.read_json("myJson.json") 
df.locations = pd.DataFrame(df.locations.values.tolist())['name'] 
df = df.groupby(['date','name','number'])['locations'].apply(','.join).reset_index() 
print (df) 
     date name number           locations 
0 2016-01-10 R 3932   Spital am Pyhrn Bahnhof,Windischgarsten Bahnho... 
+0

и json будет сырым файлом? или путь к файлу? –

+0

в документах это «Несериализованные объекты JSON», но я тестирую его с помощью dict. – jezrael

+1

Я добавляю файл для чтения, пожалуйста, проверьте его. – jezrael

Смежные вопросы