본문 바로가기
  • Survival Plan
개발 이야기/Python

[Python] 딕셔너리를 데이터 프레임으로 (Dict to DataFrame)

by IT/머신러닝 엔지니어의 독서/경제/육아 공부 리치윈드 - windFlex 2020. 3. 10.

파이썬 판단스 데이터 프레임 (Python pandas DataFrame)

파이썬 딕셔너리 to 데이터 프레임

 

파이썬으로 데이터를 분석하면서 딕셔너리 데이터 타입을 취급하는 경우가 빈번하게 발생한다. 대표적으로 웹에서 가져온 JSON 타입들이 바로 그 예이다. JSON으로 부터 적절하게 파싱을 했다고 하더라도, 파이썬의 데이터 분석 라이브러리인 Pandas로 읽어 들여 처리하려면, DataFrame형태로 변경해 주어야 한다. 

 

데이터 분석을 잘하는 사람도, 파이썬 자체를 잘하는 사람도, Pandas의 딕셔너리를 데이터프레임으로 변환하는 작업을 잘 해보지 않았다면 많으 시간을 허비하게 될 것이다.  따라서, 오늘은 Dict to DataFrame에 대해서 거론해 보도록 한다. 

 

pandas.DataFrame에 dictToDataFrame 같은 함수가 있으면 좋으련만, dict 라는 타입 자체의 자유도가 워낙 높아서 이렇게 단순하게 처리하기는 어려울 것 같다. 

 

 

파이썬 딕셔너리 (Python Dictionary Type)

 

파이썬의 딕셔너리 타입을 아주....아주... 간략히 터치를 해보자. 다음은 파이썬의 딕셔너리 타입의 가장 단순한 예이다.

{"a" : 1, "b":2}

"키(key): 값(value)" 쌍으로 이루어져 있으며, 콤마(,)를 기준으로 Key-Value 쌍이 추가될 수 있는 구조이다. 키와 값 모두 각각 제한된 형식 없이 파이썬의 모든 데이터 타입이 가능하기 때문에, 자유도가 매우 높다. 

파이썬 뿐만 아니라 javascript 등 다른 언어에서 또한 자유도가 매우 높은 데이터 타입이다. 

 

또한 다음과 같이, 값(value)에 배열/리스트 형태의 입력이 가능하기 때문에 복잡한 구조의 데이터를 하나의 딕셔너리 타입에 포함시킬 수 있다. 

a = {'a': [1, 2, 3], 'b': 20, 'c': 15, 'd': 30}

 

 

파이선 딕셔너리 (Python Dictionary Type)

 

DataFrame에 대한 고민을 하였다면, Dictionary Type 중에서 배열(Array) 또는 리스트(list) 형태를 보유하고 있는 데이터에 관심을 갖고 있을 것으로 예상 된다. 이 Dictionary 타입은 "Key:value" 쌍으로 되어 있으며, 내포가 가능한 구조이기 때문에 주의할 점이 좀 있다. 

 

dict.Key() 값의 형태를 바로 DataFrame 또는 Series로 넣게 되면, 이상한 배열 형태로 입력되게 된다. 

따라서, Dict.key 형태를 list 로 바꾸어서 입력해야 한다. 

pd.Series(list(dic_data['Store']['Tech'][k].keys()))

output : dict_keys

 

아래와 같은 실수들이 발생한다. 

파이썬 딕셔너리

keys()로 반환되는 것은, List처럼 보이나,  dict_keys 라는 타입이다. 

list 형으로 변환하지 않고, Series를 만들 경우, 아래처럼, 연속 Array가 반환 된다. 

import urllib

import json

res = urllib.request.urlopen('http://mysite.com/20170920/_mapping/')

web_data = (res.read()).decode('ascii')

dic_data = json.loads(web_data)

#str_json = json.dumps(web_data, indent=4)

#print (str_json)

print(dic_data)

dic_data['hits'] 

최종적으로, 

 

ES에서 인덱스와 데이터 타입을 불러와 DataFrame 형태로 만들기 위해 아래 코드가 사용된다. 

 

import urllib

import json

res = urllib.request.urlopen('http://150.19.5.30:9200/skt-20170920/_mapping/') # 해당 URL을 호출하면, 인덱스 + 데이터 타입 매핑이 반환



web_data = (res.read()).decode('ascii')    # res.read()의 결과값은 Byte Code로 반환된다.. 이를 Json 처리하기 위해서 String(Ascii) 변환

dic_data = json.loads(web_data)            # Dictionary 생성

#str_json = json.dumps(web_data, indent=4)

#print (str_json)

print(dic_data)

dic_data['hits']

doc_type_list = [k for k in dic_data['skt-20170920']['mappings'].keys()]
#df_doc_type = pd.DataFrame(doc_type_list, columns=['doc_type'])
#df_doc_type = pd.Series(doc_type_list)
#df_doc_type

dict_es = pd.DataFrame()
for k in doc_type_list: 
    #if k!='vpn': continue
    #print("[%s]" % k)
    dict_es[k] = pd.Series(list(dic_data['skt-20170920']['mappings'][k]['properties'].keys()))
    #print( pd.Series(dic_data['skt-20170920']['mappings'][k]['properties'].keys()) )

print(k)
dict_es.T
#pd.Series(list(dic_data['skt-20170920']['mappings'][k]['properties'].keys()))

 

 

 

 

 


관련글

2020/04/22 - [IT 이야기/IT 상식] - Python 환경 1분만에 구성하기 - 크롬 브라우저 플러그인

2020/04/30 - [개발 이야기] - 코딩시험 대비 - 웹 IDE(구름IDE)로 개발(Coding)환경을 구축해 보자.

2020/03/10 - [개발 이야기/Python] - [Python] 파일 해쉬 (hash) 및 Strings 기능

2020/03/10 - [IT 이야기] - 파이썬 Pandas x Excel

2020/03/10 - [개발 이야기] - RESTful API with Flask

2020/03/10 - [IT 이야기] - Python/Anaconda x Jupyter x VSCode 개발환경

2020/03/10 - [IT 이야기] - Python x Jupyter Notebook 사용하기

2020/03/10 - [개발 이야기] - Elasticsearch x Python - 엘리스틱 서치 연동

2020/03/09 - [개발 이야기/Python] - Python Numpy 추천 문서 및 유의점

2018/03/03 - [개발 이야기/Python] - [Python] Py2Exe - Python 스크립트를 Exe로 배포하자 !!

2018/03/03 - [개발 이야기/Python] - [파이썬-Python] Numpy는 왜 필요할까?

2018/03/03 - [개발 이야기/Python] - 피보나치(Fibonacci) 수열을 구현하는 7가지 방법 - 파이썬(Python) 피보나치 구현 7선

 

 

 

 

댓글0