Python

[Python] DataFrame 생성 시 ValueError: If using all scalar values, you must pass an index

비번변경 2022. 12. 16. 23:40

현상

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