programing

팬더 컬럼 내의 JSON 데이터를 새 컬럼으로 변환하는 방법

closeapi 2023. 3. 2. 22:17
반응형

팬더 컬럼 내의 JSON 데이터를 새 컬럼으로 변환하는 방법

ADSB json 데이터의 쇼트 버전을 가지고 있으며, Icao, Alt, Lat, Long, Spd, Cou로 변환하고 싶습니다.

알페렌이 시킨 후에

df = pd.read_json('2016-06-20-2359Z.json', lines=True), 

데이터 프레임에 로드할 수 있습니다.하지만,df.acList

[{'Id'}: 10537990, 'Rcvr': 1, 'HasSig': False, ...
이름: acList, dtype: 객체

Icao, Alt, Lat, Long, Spd, Cou 데이터는 어떻게 얻을 수 있습니까?

 "src":1,
   "feeds":[  
      {  
         "id":1,
         "name":"ADSBexchange.com",
         "polarPlot":false
      }
   ],
   "srcFeed":1,
   "showSil":true,
   "showFlg":true,
   "showPic":true,
   "flgH":20,
   "flgW":85,
   "acList":[  
      {  
         "Id":11281748,
         "Rcvr":1,
         "HasSig":false,
         "Icao":"AC2554",
         "Bad":false,
         "Reg":"N882AS",
         "FSeen":"\/Date(1466467166951)\/",
         "TSecs":3,
         "CMsgs":1,
         "AltT":0,
         "Tisb":false,
         "TrkH":false,
         "Type":"CRJ2",
         "Mdl":"2001 
BOMBARDIER INC 
 CL-600-2B19",
         "Man":"Bombardier",
         "CNum":"7503",
         "Op":"EXPRESSJET AIRLINES INC - ATLANTA, GA",
         "OpIcao":"ASQ",
         "Sqk":"",
         "VsiT":0,
         "WTC":2,
         "Species":1,
         "Engines":"2",
         "EngType":3,
         "EngMount":1,
         "Mil":false,
         "Cou":"United States",
         "HasPic":false,
         "Interested":false,
         "FlightsCount":0,
         "Gnd":false,
         "SpdTyp":0,
         "CallSus":false,
         "TT":"a",
         "Trt":1,
         "Year":"2001"
      },
      {  
         "Id":11402205,
         "Rcvr":1,
         "HasSig":true,
         "Sig":110,
         "Icao":"ADFBDD",
         "Bad":false,
         "FSeen":"\/Date(1466391940977)\/",
         "TSecs":75229,
         "CMsgs":35445,
         "Alt":8025,
         "GAlt":8025,
         "AltT":0,
         "Call":"TEST1234",
         "Tisb":false,
         "TrkH":false,
         "Sqk":"0262",
         "Help":false,
         "VsiT":0,
         "WTC":0,
         "Species":0,
         "EngType":0,
         "EngMount":0,
         "Mil":true,
         "Cou":"United States",
         "HasPic":false,
         "Interested":false,
         "FlightsCount":0,
         "Gnd":true,
         "SpdTyp":0,
         "CallSus":false,
         "TT":"a",
         "Trt":1
      }
   ],
   "totalAc":4231,
   "lastDv":"636019887431643594",
   "shtTrlSec":61,
   "stm":1466467170029
}
</pre>

데이터가 이미 있는 경우acList다음과 같은 작업을 수행할 수 있습니다.

import pandas as pd
pd.io.json.json_normalize(df.acList[0])

Alt AltT    Bad CMsgs   CNum    Call    CallSus Cou EngMount    EngType ... Sqk TSecs   TT  Tisb    TrkH    Trt Type    VsiT    WTC Year
0   NaN 0   False   1   7503    NaN False   United States   1   3   ...     3   a   False   False   1   CRJ2    0   2   2001
1   8025.0  0   False   35445   NaN TEST1234    False   United States   0   0   ... 0262    75229   a   False   False   1   NaN 0   0   NaN

팬더 1.0 이후 수입량은 다음과 같습니다.

import pandas as pd
pd.json_normalize(df.acList[0])

@Sergey의 답변으로 문제가 해결되었지만 데이터 프레임 컬럼의 json이 객체가 아닌 문자열로 유지되었기 때문에 문제가 발생했습니다.기둥 매핑을 위한 추가 단계를 추가해야 했습니다.

import json
import pandas as pd
pd.io.json.json_normalize(df.acList.apply(json.loads))

팬더 1.0 이후 json_normalize는 최상위 네임스페이스에서 사용할 수 있습니다.따라서 다음을 사용합니다.

import pandas as pd
pd.json_normalize(df.acList[0])

ThinkBonobo의 답변에 대해서는 아직 코멘트는 할 수 없지만 칼럼의 JSON이 사전이 아닌 경우에는 계속 할 수 있습니다..apply그렇게 될 때까지.그래서 저 같은 경우에는

import json
import pandas as pd

json_normalize(
    df
    .theColumnWithJson
    .apply(json.loads)
    .apply(lambda x: x[0]) # the inner JSON is list with the dictionary as the only item
)

제 경우에는 몇 가지 누락된 값이 있었습니다.None그런 다음 새 열을 만든 후 원래 열도 삭제하는 보다 구체적인 코드를 만들었습니다.

for prefix in ['column1', 'column2']:
    df_temp = df[prefix].apply(lambda x: {} if pd.isna(x) else x)
    df_temp = pd.io.json.json_normalize(df_temp)
    df_temp = df_temp.add_prefix(prefix + '_')
    df.drop([prefix], axis=1, inplace=True)
    df = pd.concat([df, df_temp], axis = 1, sort=False)

언급URL : https://stackoverflow.com/questions/46391291/how-to-convert-json-data-inside-a-pandas-column-into-new-columns

반응형