Dev/python

[pandas] 데이터프레임 딕셔너리로 변환하기, df.to_dict('records')

bskyvision.com 2023. 9. 7. 06:29

판다스 데이터프레임을 파이썬의 딕셔너리로 바꿔야하는 경우들이 종종 있습니다. 특히 판다스 데이터프레임으로 데이터 연산을 하다가 FastAPI와 같은 백엔드 서버로 그 값을 응답해야 하는 경우에 많이 사용합니다. 딕셔너리랑 JSON이랑 호환이 잘 되기 때문입니다. 이런 경우에는 데이터프레임 객체의 to_dict() 메소드를 활용할 수 있습니다. 

 

데이터프레임.to_dict() 메서드 활용법

to_dict() 메소드의 첫번째 매개변수는 orient인데 여기에 넣어줄 수 있는 인수는 다음과 같습니다.

 

{‘dict’, ‘list’, ‘series’, ‘split’, ‘tight’, ‘records’, ‘index’} 

 

default는 dict입니다. 

 

각각 이런 형태로 데이터프레임을 딕셔너리로 변환해줍니다.

 

  • ‘dict’ (default) : dict like {column -> {index -> value}}
  • ‘list’ : dict like {column -> [values]}
  • ‘series’ : dict like {column -> Series(values)}
  • ‘split’ : dict like {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}
  • ‘tight’ : dict like {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values], ‘index_names’ -> [index.names], ‘column_names’ -> [column.names]}
  • ‘records’ : list like [{column -> value}, … , {column -> value}]
  • ‘index’ : dict like {index -> {column -> value}}

 

예시로 하나의 데이터프레임을 다양한 형태의 딕셔너리로 변환해보겠습니다. 예시 데이터 프레임은 다음과 같습니다.

 

import pandas as pd


df = pd.DataFrame(
        [[95, 92, 88], [84, 67, 88], [91, 99, 68], [87, 79, 81], [77, 92, 85]],
        columns=['math', 'english', 'history']
    )
print(df)
#    math  english  history
# 0    95       92       88
# 1    84       67       88
# 2    91       99       68
# 3    87       79       81
# 4    77       92       85

 

이제 하나씩 살펴보겠습니다.

 

dict (default)

dict1 = df.to_dict()
print(dict1)
# {'math': {0: 95, 1: 84, 2: 91, 3: 87, 4: 77}, 'english': {0: 92, 1: 67, 2: 99, 3: 79, 4: 92}, 'history': {0: 88, 1: 88, 2: 68, 3: 81, 4: 85}}

 

list

dict2 = df.to_dict('list')
print(dict2)
# {'math': [95, 84, 91, 87, 77], 'english': [92, 67, 99, 79, 92], 'history': [88, 88, 68, 81, 85]}

 

프론트엔드에서 차트를 그려야 하는 경우에 이 형태로 변환해서 API로 응답해주곤 합니다. 

 

series

dict3 = df.to_dict('series')
print(dict3)
# {'math': 0    95
# 1    84
# 2    91
# 3    87
# 4    77
# Name: math, dtype: int64, 'english': 0    92
# 1    67
# 2    99
# 3    79
# 4    92
# Name: english, dtype: int64, 'history': 0    88
# 1    88
# 2    68
# 3    81
# 4    85
# Name: history, dtype: int64}

 

split

dict4 = df.to_dict('split')
print(dict4)
# {'index': [0, 1, 2, 3, 4], 'columns': ['math', 'english', 'history'], 'data': [[95, 92, 88], [84, 67, 88], [91, 99, 68], [87, 79, 81], [77, 92, 85]]}

 

tight

dict5 = df.to_dict('tight')
print(dict5)
# {'index': [0, 1, 2, 3, 4], 'columns': ['math', 'english', 'history'], 'data': [[95, 92, 88], [84, 67, 88], [91, 99, 68], [87, 79, 81], [77, 92, 85]], 'index_names': [None], 'column_names': [None]}

 

records

dict6 = df.to_dict('records')
print(dict6) 
# [{'math': 95, 'english': 92, 'history': 88}, {'math': 84, 'english': 67, 'history': 88}, {'math': 91, 'english': 99, 'history': 68}, {'math': 87, 'english': 79, 'history': 81}, {'math': 77, 'english': 92, 'history': 85}]

 

제가 가장 많이 사용하는 형태입니다. 대체적으로 API로 응답할 때 이 형태로 변환해서 전달합니다. 

 

index

dict7 = df.to_dict('index')
print(dict7)
# {0: {'math': 95, 'english': 92, 'history': 88}, 1: {'math': 84, 'english': 67, 'history': 88}, 2: {'math': 91, 'english': 99, 'history': 68}, 3: {'math': 87, 'english': 79, 'history': 81}, 4: {'math': 77, 'english': 92, 'history': 85}}

 

참고자료

[1] https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_dict.html