programing

판다들은 네스트된 json을 읽는다.

i4 2023. 3. 7. 21:05
반응형

판다들은 네스트된 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')

편집하다

첫 번째 답변 감사합니다.질문을 좀 더 자세히 설명하겠습니다. 어레이 내의 중첩된 속성을 평탄화하는 것은 필수가 아닙니다.df.locations['name']를 [A, B, C]만 연결하면 됩니다.

파일에 여러 개의 JSON 개체(한 줄에 1개)가 포함되어 있습니다. 번호, 날짜, 이름 및 위치 열을 유지하고 싶습니다.하지만 저는 그 장소에 합류해야 합니다.

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

여기에서의 나의 접근은 효율적인 것 같지 않다 / 판다 스타일.

다음을 사용할 수 있습니다.

import json

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

df = pd.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 

편집:

를 구문 분석과 함께 사용할 수 있습니다.name타고DataFrame생성자 및 마지막으로 적용됨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... 

노트북으로 작업 중이었기 때문에 누군가 이것을 발견하면 또 다른 선택사항이 있습니다.파일을 df로 읽습니다.

df = pd.read_json('filename.json')
df2 = pd.DataFrame.from_records(df['nest_level_1']['nest_level_2'])

해피 코딩

대신할 수 있는 방법pandas.json_normalize네스트된 사전에서 선택한 키와 값만 추출하여 자체 데이터 프레임을 구축하는 것입니다.이렇게 하는 주된 이유는 json_normalize가 매우 큰 json 파일에 대해 느려지기 때문입니다(또한 원하는 출력이 항상 생성되지는 않을 수도 있습니다).

그래서, 여기 판다의 중첩된 사전을 평평하게 만드는 다른 방법이 있습니다.glom목적은 중첩된 사전에서 선택된 키와 값을 추출하여 판다 데이터 프레임의 별도 열에 저장하는 것입니다(:

스텝 바이 스텝 가이드를 소개합니다.https://medium.com/ @httpo.almani / http-pari-in-http-glom-7948345c88f5

import pandas as pd
from glom import glom
from ast import literal_eval


target = {
    "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"
        }
}   



# Import data
df = pd.DataFrame([str(target)], columns=['target'])

# Extract id keys and save value into a separate pandas column
df['id'] = df['target'].apply(lambda row: glom(literal_eval(row), 'locations.name'))

언급URL : https://stackoverflow.com/questions/40588852/pandas-read-nested-json

반응형