Eu tenho um dicionário Python como o seguinte:
{u'2012-06-08': 388,
u'2012-06-09': 388,
u'2012-06-10': 388,
u'2012-06-11': 389,
u'2012-06-12': 389,
u'2012-06-13': 389,
u'2012-06-14': 389,
u'2012-06-15': 389,
u'2012-06-16': 389,
u'2012-06-17': 389,
u'2012-06-18': 390,
u'2012-06-19': 390,
u'2012-06-20': 390,
u'2012-06-21': 390,
u'2012-06-22': 390,
u'2012-06-23': 390,
u'2012-06-24': 390,
u'2012-06-25': 391,
u'2012-06-26': 391,
u'2012-06-27': 391,
u'2012-06-28': 391,
u'2012-06-29': 391,
u'2012-06-30': 391,
u'2012-07-01': 391,
u'2012-07-02': 392,
u'2012-07-03': 392,
u'2012-07-04': 392,
u'2012-07-05': 392,
u'2012-07-06': 392}
As chaves são datas Unicode e os valores são números inteiros. Gostaria de converter isso em um dataframe de pandas, tendo as datas e seus valores correspondentes como duas colunas separadas. Exemplo: col1: Datas col2: DateValue (as datas ainda são Unicode e os valores de dados ainda são inteiros)
Date DateValue
0 2012-07-01 391
1 2012-07-02 392
2 2012-07-03 392
. 2012-07-04 392
. ... ...
. ... ...
Qualquer ajuda nessa direção seria muito apreciada. Não consigo encontrar recursos nos documentos do pandas para me ajudar com isso.
Eu sei que uma solução pode ser converter cada par de valor-chave neste ditado, em um ditado, para que toda a estrutura se torne um ditado de ditados e, em seguida, podemos adicionar cada linha individualmente ao quadro de dados. Mas quero saber se existe uma maneira mais fácil e mais direta de fazer isso.
Até agora, tentei converter o dict em um objeto de série, mas isso não parece manter o relacionamento entre as colunas:
s = Series(my_dict,index=my_dict.keys())
Respostas:
O erro aqui é desde que você chamou o construtor DataFrame com valores escalares (onde espera que os valores sejam uma lista / dict / ... ou seja, tenham várias colunas):
Você pode pegar os itens do dicionário (ou seja, os pares de valores-chave):
Mas acho que faz mais sentido passar no construtor Series:
fonte
from_dict
tem um orient kwarg, então eu poderia usá-lo se quisesse evitar a transposição. Existem poucas opções comfrom_dict
, sob o capô, não é realmente diferente do uso do construtor DataFrame.pandas.core.common.PandasError: DataFrame constructor not properly called!
desde o primeiro exemploAo converter um dicionário em um dataframe do pandas, no qual você deseja que as chaves sejam as colunas do referido dataframe e os valores nos valores da linha, basta colocar colchetes no dicionário da seguinte maneira:
Isso me salvou algumas dores de cabeça, então espero que ajude alguém lá fora!
EDIT: Nos documentos do pandas, uma opção para o
data
parâmetro no construtor DataFrame é uma lista de dicionários. Aqui estamos passando uma lista com um dicionário.fonte
Conforme explicado em outra resposta, o uso
pandas.DataFrame()
direto aqui não funcionará como você pensa.O que você pode fazer é usar
pandas.DataFrame.from_dict
comorient='index'
:fonte
rename
método para também definir os nomes do índice e das colunas de uma só vez?Passe os itens do dicionário para o construtor DataFrame e forneça os nomes das colunas. Depois disso, analise a
Date
coluna para obterTimestamp
valores.Observe a diferença entre python 2.xe 3.x:
No python 2.x:
No Python 3.x: (exigindo uma 'lista' adicional)
fonte
PandasError: DataFrame constructor not properly called!
df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
ps em particular, achei exemplos orientados a linhas úteis; desde que frequentemente como os registros são armazenados externamente.
https://pbpython.com/pandas-list-dict.html
fonte
Os pandas possuem função interna para conversão de dict em quadro de dados.
Para seus dados, você pode convertê-lo como abaixo:
fonte
fonte
Você também pode simplesmente passar as chaves e os valores do dicionário para o novo quadro de dados, assim:
fonte
No meu caso, eu queria que as chaves e os valores de um ditado fossem colunas e valores do DataFrame. Então, a única coisa que funcionou para mim foi:
fonte
Foi o que funcionou para mim, pois eu queria ter uma coluna de índice separada
fonte
Aceita um ditado como argumento e retorna um quadro de dados com as chaves do ditado como índice e os valores como uma coluna.
fonte
É assim que funcionou para mim:
Eu espero que isso ajude
fonte
Se você não encapsular
yourDict.keys()
dentro delist()
, você terminará com todas as suas chaves e valores sendo colocados em todas as linhas de cada coluna. Como isso:Date \ 0 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
1 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
2 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
3 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
4 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
Mas, adicionando
list()
o resultado, fica assim:Date Date_Values 0 2012-06-08 388 1 2012-06-09 388 2 2012-06-10 388 3 2012-06-11 389 4 2012-06-12 389 ...
fonte
Encontrei isso várias vezes e tenho um exemplo de dicionário que criei a partir de uma função
get_max_Path()
, e ele retorna o exemplo de dicionário:{2: 0.3097502930247044, 3: 0.4413177909384636, 4: 0.5197224051562838, 5: 0.5717654946470984, 6: 0.6063959031223476, 7: 0.6365209824708223, 8: 0.655918861281035, 9: 0.680844386645206}
Para converter isso em um quadro de dados, executei o seguinte:
df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()
Retorna um quadro de dados simples de duas colunas com um índice separado:
index 0 0 2 0.309750 1 3 0.441318
Apenas renomeie as colunas usando
f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)
fonte
Eu acho que você pode fazer algumas alterações no seu formato de dados ao criar um dicionário e convertê-lo facilmente em DataFrame:
entrada:
resultado:
entrada:
output: será seu DataFrame
Você só precisa usar alguma edição de texto em algum lugar como o Sublime ou talvez o Excel.
fonte