현상
DataFrame은 일종의 딕셔너리처럼 생각할 수 있으므로 아래와 같은 코드로 DataFrame을 생성하려고 했다.
import pandas as pd
d = {
'col_1': 1,
'col_2': 2
}
pd.DataFrame(d)
하지만 ValueError: If using all scalar values, you must pass an index가 발생하면서 실패했다.
무엇이 문제였을까?
원인
2022.12.10 - [Python] Pandas - DataFrame 1에서 살펴본 것에 의하면 DataFrame은 공통 인덱스를 가진 column series를 딕셔너리로 묶어놓은 것이다. 즉, Series로 취급할 수 없는 단일 값을 가지는 딕셔너리를 전달한 것이 에러가 발생한 원인이다.
해결
해결 방법은 크게 네 가지로 정리할 수 있다.
1. index label 설정
에러 메시지에 안내된 대로 행 인덱스를 전달한다.
import pandas as pd
d = {
'col_1': 1,
'col_2': 2
}
index = [0]
pd.DataFrame(d, index=index)
실행 결과
2. 단일 값 대신 리스트를 전달한다.
DataFrame 생성 시 전달할 딕셔너리의 값을 리스트로 변경한다.
import pandas as pd
d = {
'col_1': [1],
'col_2': [2]
}
pd.DataFrame(d)
3. pd.DataFrame.from_dict 함수를 이용하여 DataFrame 생성
from_dict 함수에 Dictionary를 원소로 갖는 리스트로 DataFrame로 생성할 데이터를 전달한다.
import pandas as pd
d = [
{
'col_1': 1,
'col_2': 2
}
]
pd.DataFrame.from_dict(d)
4. pd.DataFrame.from_records 함수를 이용하여 DataFrame 생성
from_records 함수는 ndarray를 DataFrame을 생성하는데, ndarray, 여러 개의 튜플이나 딕셔너리, DataFrame으로부터 DataFrame을 생성한다.
import pandas as pd
d = [
{
'col_1': 1,
'col_2': 2
}
]
pd.DataFrame.from_records(d)
참고 문서
https://rfriend.tistory.com/482
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.from_dict.html
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_records.html