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