변수의 값으로 팬더 DataFrame을 생성하면 "ValueError : 모든 스칼라 값을 사용하는 경우 인덱스를 전달해야합니다"가 나타납니다.


370

이것은 간단한 질문 일지 모르지만 어떻게 해야하는지 알 수 없습니다. 다음과 같이 두 가지 변수가 있다고 가정 해 봅시다.

a = 2
b = 3

이로부터 DataFrame을 구성하고 싶습니다.

df2 = pd.DataFrame({'A':a,'B':b})

오류가 발생합니다.

ValueError : 모든 스칼라 값을 사용하는 경우 인덱스를 전달해야합니다

나는 이것을 시도했다 :

df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()

동일한 오류 메시지가 나타납니다.

답변:


571

스칼라 값을 전달하는 경우 인덱스를 전달해야한다는 오류 메시지가 표시됩니다. 따라서 열에 스칼라 값을 사용할 수 없습니다 (예 : 목록 사용).

>>> df = pd.DataFrame({'A': [a], 'B': [b]})
>>> df
   A  B
0  2  3

또는 스칼라 값을 사용하고 색인을 전달하십시오.

>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
   A  B
0  2  3

7
아마도 파이썬의 목록에있는 항목의 순서는 영구적이지만 사전의 항목의 순서는 그렇지 않기 때문일 수 있습니다. 빈 사전을 사용하여 DataFrame을 인스턴스화 할 수 있습니다. 원칙적으로 나는 여기에 표시된 단일 행 DataFrame이 순서가 중요하지 않기 때문에 사전에서 빌드해도 괜찮을 것이라고 가정합니다 (그러나 이것은 구현되지 않았습니다). 그러나 행이 여러 개인 경우 Pandas는 동일한 행에 속하는 항목을 알 수 없으므로 DataFrame을 만들 수 없습니다.
Alexander

2
@VitalyIsaev-이 경우 데이터 프레임 행 (주어진 사전으로 표시됨)에는 인덱스가 없습니다 (암시적인 것조차 아님). 간단한 해결책은 사전을 "자연 색인"이있는 목록으로 묶는 것입니다. 랩핑리스트없이 하나의 사전 만 제공된다면, 가정 index=0하지만 실수로 오용 될 수 있습니다 (단일 사전이 어떻게 든 다중 행 데이터 프레임을 생성 할 수 있다고 생각 함)
Ori

이 링크에서 몇 가지 솔루션 eulertech.wordpress.com/2017/11/28/…
Jason Goal

그 이유는 DataFrames가 2 차원 데이터 (즉, OP의 두 변수 행)를 보유하기 때문입니다. 사전과 같은 색인-> 값 쌍을 유지하려면 Rob이 제안한 대로 Series를 사용해야 합니다.
danuker

이것은 단일 샘플 / 행 데이터 프레임이므로 index = [0]은 논리적으로 의미가 있습니다. 그러나 index = [100]이되도록 조작 할 수도 있습니다. Q : 인덱스가 논리적으로 점진적으로 정렬되어 있지 않은데 왜 파이썬이 인덱스 조작을 허용합니까?
Sumanth Lazarus '

65

pd.DataFrame.from_records사전을 이미 가지고있을 때 더 편리한 것을 사용할 수도 있습니다 .

df = pd.DataFrame.from_records([{ 'A':a,'B':b }])

원하는 경우 색인을 다음과 같이 설정할 수도 있습니다.

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')

27
이 답변은 저에게 효과적이지 않습니다 .from_records를 사용할 때 동일한 오류 메시지가 나타납니다.
Dave Kielpinski

데이브, 당신은 코드 조각을 시도 했습니까 (물론 a와 b를 정의하십시오)? 여전히 오류 메시지가 표시됩니까? 게시 할 수 있습니까?
fAX

12
@DaveKielpinski 대괄호 추가를 잊었습니까?
Dennis

dict 키를 열 이름으로 사용합니다. 키를 색인으로 설정하는 방법은 무엇입니까?
mingchau

@DaveKielpinski 목록 을 "from_records"메소드에 전달했는지 확인하십시오 . 그렇지 않으면 작동하지 않으며 사전에서 DataFrame을 호출 할 때와 같은 오류 메시지가 표시됩니다.
mairan

55

먼저 팬더 시리즈를 만들어야합니다. 두 번째 단계는 팬더 시리즈를 팬더 데이터 프레임으로 변환하는 것입니다.

import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()

열 이름을 제공 할 수도 있습니다.

pd.Series(data).to_frame('ColumnName')

1
이것은 나를 위해 일했습니다. 내 사전에는 정수 키와 ndarray 값이 있습니다.
StatsSorceress

pd.Series(data).to_frame('ColumnName')이 내용은 아마도 더 직접적이지만 더 짧습니다.pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

사전을 목록에 배치하려고 시도 할 수 있습니다.

my_dict = {'A':1,'B':2}

pd.DataFrame([my_dict])

   A  B
0  1  2

8

아마도 Series는 필요한 모든 기능을 제공 할 것입니다.

pd.Series({'A':a,'B':b})

DataFrame은 Series의 모음으로 생각할 수 있습니다.

  • 여러 Series를 하나의 데이터 프레임으로 연결 ( 여기에 설명 된대로 )

  • 기존 데이터 프레임에 Series 변수 추가 ( 예 : 여기 )


7

Pandas DataFrame 열의 값으로 이터 러블을 제공해야합니다.

df2 = pd.DataFrame({'A':[a],'B':[b]})

6

나는 numpy 배열과 같은 문제가 있었고 해결책은 그것들을 평평하게하는 것입니다.

data = {
    'b': array1.flatten(),
    'a': array2.flatten(),
}

df = pd.DataFrame(data)

3

스칼라 사전을 변환하려면 인덱스를 포함시켜야합니다.

import pandas as pd

alphabets = {'A': 'a', 'B': 'b'}
index = [0]
alphabets_df = pd.DataFrame(alphabets, index=index)
print(alphabets_df)

목록 사전에는 색인이 필요하지 않지만 동일한 아이디어를 목록 사전으로 확장 할 수 있습니다.

planets = {'planet': ['earth', 'mars', 'jupiter'], 'length_of_day': ['1', '1.03', '0.414']}
index = [0, 1, 2]
planets_df = pd.DataFrame(planets, index=index)
print(planets_df)

물론, 목록 사전의 경우 인덱스없이 데이터 프레임을 작성할 수 있습니다.

planets_df = pd.DataFrame(planets)
print(planets_df)

3

시도해 볼 수 있습니다 :

df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')

'orient'인수에 대한 문서에서 : 전달 된 dict의 키가 결과 DataFrame의 열이어야하는 경우 'columns'(기본값)를 전달하십시오. 그렇지 않으면 키가 행이어야하는 경우 'index'를 전달하십시오.


질문 / 답변을 올바르게 편집하고 형식을 지정하려면 서식 도구를 사용하십시오. 문장 내에서 코드로 포맷을하는 code 것으로 매우 중요 단어를 굵게 , 덜 중요한 onces 기울임 꼴은 또한 필요한 경우 목록을 사용
모스

이렇게하면 질문이 해결되지 않고 원하는 결과와 다른 결과가 나타납니다.
켄 윌리엄스

3

직장에서 팬더 마술. 모든 논리가 끝났습니다.

오류 메시지 "ValueError: If using all scalar values, you must pass an index"인덱스를 전달해야한다고 말합니다.

이것은 반드시 인덱스를 전달한다는 것이 팬더가 원하는 일을 하게한다는 것을 의미하지는 않습니다.

인덱스를 전달하면 팬더는 사전 키를 열 이름으로, 값을 인덱스의 각 값에 대해 열에 포함해야하는 값으로 처리합니다.

a = 2
b = 3
df2 = pd.DataFrame({'A':a,'B':b}, index=[1])

    A   B
1   2   3

더 큰 인덱스를 전달 :

df2 = pd.DataFrame({'A':a,'B':b}, index=[1, 2, 3, 4])

    A   B
1   2   3
2   2   3
3   2   3
4   2   3

인덱스는 일반적으로 데이터 프레임이 없으면 데이터 프레임에 의해 자동으로 생성됩니다. 그러나, 팬더의 행 수를 알 수 없습니다 23당신이 원하는. 그러나 당신은 그것에 대해 더 명확 할 수 있습니다

df2 = pd.DataFrame({'A':[a]*4,'B':[b]*4})
df2

    A   B
0   2   3
1   2   3
2   2   3
3   2   3

기본 인덱스는 0을 기준으로합니다.

데이터 프레임을 만들 때 항상 목록 사전을 데이터 프레임 생성자에 전달하는 것이 좋습니다. 다른 개발자에게는 읽기 쉽습니다. 팬더는 많은 경고가 있습니다. 다른 개발자가 코드를 읽기 위해 모든 개발자에게 전문가를 요구하지 마십시오.


3

입력은 레코드 목록 일 필요는 없습니다. 단일 사전 일 수도 있습니다.

pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
   a  b
0  1  2

다음과 같은 것으로 보입니다.

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2

2

열 - DataFrame 두 직관적 인 차원 있기 때문입니다 행을.

사전 키를 사용하여 열만 지정하고 있습니다.

1 차원 데이터 만 지정하려면 Series!


0

사전을 데이터 프레임으로 변환

col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()

열에 새 이름을 지정하십시오

col_dict_df.columns = ['col1', 'col2']

-2

사전이 있다면 다음 코드 줄을 사용하여 사전을 팬더 데이터 프레임으로 바꿀 수 있습니다.

pd.DataFrame({"key": d.keys(), "value": d.values()})

그것은 작동하지만 IMHO는별로 이해가되지 않습니다. <code>`<!-language : lang-py-> fruits_count = defaultdict (int) fruits_count [ "apples"] = 10 fruits_count [ "bananas"] = 21 pd.DataFrame ({ "key": fruits_count.keys (), "value": fruits_count.values ​​()}) Out : 키 값 0 (바나나, 사과) (21, 10) 1 (바나나, 사과) (21, 10) <code>
Emiter

-3

목록에 dict을 전달하십시오.

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.