Construir o DataFrame dos pandas a partir de valores em variáveis ​​fornece "ValueError: se você estiver usando todos os valores escalares, deverá passar um índice"


370

Esta pode ser uma pergunta simples, mas não consigo descobrir como fazer isso. Digamos que eu tenho duas variáveis ​​da seguinte maneira.

a = 2
b = 3

Eu quero construir um DataFrame a partir disso:

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

Isso gera um erro:

ValueError: se estiver usando todos os valores escalares, você deve passar um índice

Eu tentei isso também:

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

Isso dá a mesma mensagem de erro.

Respostas:


571

A mensagem de erro diz que se você estiver passando valores escalares, precisará passar um índice. Portanto, você não pode usar valores escalares para as colunas - por exemplo, use uma lista:

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

ou use valores escalares e passe um índice:

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

7
Talvez seja porque a ordem dos itens em uma lista no Python é persistente, enquanto a ordem dos itens em um dicionário não é. Você pode instanciar um DataFrame com um dicionário vazio. Em princípio, suponho que um DataFrame de uma única linha, como mostrado aqui, também possa ser compilado a partir de um dicionário porque a ordem não importa (mas isso não foi implementado). No entanto, com várias linhas, o Pandas não seria capaz de criar um DataFrame porque não saberia quais itens pertenciam à mesma linha.
Alexander

2
@VitalyIsaev - Nesse caso, a linha do quadro de dados (representada pelo dicionário fornecido) não tem índice (nem mesmo implícito). Uma solução simples é agrupar o dicionário em uma lista, que possui "indexação natural". Pode-se afirmar que, se apenas um dicionário é dada (sem uma lista de embalagem), em seguida, assumir index=0, mas que pode levar ao mau uso acidental (pensando que um único dicionário de alguma forma pode criar uma trama de dados de multi-linha)
Ori

várias soluções neste link eulertech.wordpress.com/2017/11/28/…
Jason Goal

A razão para isso é que os DataFrames devem conter dados bidimensionais (ou seja, linhas das duas variáveis ​​do OP). Se você deseja simplesmente manter pares de índice -> valor (como um dicionário), use uma série, como sugere Rob .
21419 Danuker

Este é um único Dataframe de amostra / linha; portanto, index = [0] faz sentido lógico; mas você também pode manipulá-lo para ser index = [100], o que funciona. P: O Index não deve ser ordenado logicamente de forma incremental, por que o python permite a manipulação do Index?
Sumanth Lázaro

65

Você também pode usar o pd.DataFrame.from_recordsque é mais conveniente quando você já tem o dicionário em mãos:

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

Você também pode definir o índice, se desejar, por:

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

27
Esta resposta não funciona para mim - recebo a mesma mensagem de erro ao usar from_records.
Dave Kielpinski 14/03

Dave, você tentou o código (defina aeb, é claro)? Você ainda recebe uma mensagem de erro? Você pode postar?
FAX 15/03/19

12
@DaveKielpinski Esqueceu-se de adicionar os parênteses?
Dennis

Isso usará as chaves dict como os nomes das colunas. Como definir as chaves para indexar?
Mingchau

@DaveKielpinski Por favor, verifique se você passou uma lista para o método "from_records"; caso contrário, não funcionará e você receberá a mesma mensagem de erro quando chama o DataFrame no dicionário.
Mairan

55

Você precisa criar uma série de pandas primeiro. O segundo passo é converter a série de pandas em dataframe de pandas.

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

Você pode até fornecer um nome de coluna.

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

11
Isso funcionou para mim. Meu dicionário tinha chaves inteiras e valores ndarray.
StatsSorceress

pd.Series(data).to_frame('ColumnName')é mais curto, embora este equivalente é talvez mais direto:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

Você pode tentar incluir seu dicionário na lista

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8

Talvez o Series forneça todas as funções necessárias:

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

O DataFrame pode ser considerado uma coleção de Séries, portanto, você pode:

  • Concatene várias séries em um quadro de dados (conforme descrito aqui )

  • Adicione uma variável Series ao quadro de dados existente ( exemplo aqui )


7

Você precisa fornecer iterables como os valores para as colunas DataFrame do Pandas:

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

6

Eu tive o mesmo problema com matrizes numpy e a solução é achatá-las:

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

df = pd.DataFrame(data)

3

Se você pretende converter um dicionário de escalares, é necessário incluir um índice:

import pandas as pd

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

Embora o índice não seja necessário para um dicionário de listas, a mesma ideia pode ser expandida para um dicionário de listas:

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)

Obviamente, para o dicionário de listas, você pode criar o quadro de dados sem um índice:

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

3

Você poderia tentar:

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

Na documentação do argumento 'orientar': Se as chaves do ditado passado devem ser as colunas do DataFrame resultante, passe 'colunas' (padrão). Caso contrário, se as chaves forem linhas, passe 'index'.


Use as ferramentas de formatação para editar e formatar corretamente sua pergunta / resposta. Códigos dentro frases devem ser formatado como code palavras muito importantes para ser ousado , onces menor importantes Itálico também usar listas, se necessário
Morse

Isso não resolve a pergunta, produz um resultado diferente do desejado.
Ken Williams

3

Pandas mágicos no trabalho. Toda a lógica está fora.

A mensagem de erro "ValueError: If using all scalar values, you must pass an index" Diz que você deve passar um índice.

Isso não significa necessariamente que a aprovação de um índice faça os pandas fazerem o que você quer que ele faça

Quando você passa um índice, os pandas tratam as chaves do dicionário como nomes de colunas e os valores como o que a coluna deve conter para cada um dos valores no índice.

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

    A   B
1   2   3

Passando um índice maior:

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

Um índice geralmente é gerado automaticamente por um quadro de dados quando nenhum é fornecido. No entanto, os pandas não sabe quantas linhas de 2e 3você quer. No entanto, você pode ser mais explícito sobre isso

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

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

O índice padrão é baseado em 0.

Eu recomendaria sempre passar um dicionário de listas para o construtor de quadro de dados ao criar quadros de dados. É mais fácil ler para outros desenvolvedores. O Pandas tem muitas advertências, não faça com que outros desenvolvedores tenham especialistas em todos eles para ler seu código.


3

a entrada não precisa ser uma lista de registros - também pode ser um dicionário único:

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

O que parece ser equivalente a:

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

2

Isso ocorre porque um DataFrame possui duas dimensões intuitivas - as colunas e as linhas.

Você está especificando apenas as colunas usando as chaves do dicionário.

Se você deseja especificar apenas dados unidimensionais, use uma Série!


0

Converter dicionário em quadro de dados

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

Atribua novo nome à coluna

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

-2

Se você possui um dicionário, pode transformá-lo em um quadro de dados do pandas com a seguinte linha de código:

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

Funciona, mas IMHO não faz muito sentido <code> `<! - language: lang-py -> fruits_count = defaultdict (int) fruits_count [" maçãs "] = 10 fruit_count [" bananas "] = 21 pd.DataFrame ({"key": fruits_count.keys (), "value": fruits_count.values ​​()}) Fora: valor da chave 0 (bananas, maçãs) (21, 10) 1 (bananas, maçãs) (21, 10) <code>
Emiter

-3

Basta passar o dict em uma lista:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.