Eu entendo que os pandas são projetados para carregar totalmente preenchidos DataFrame
mas preciso criar um DataFrame vazio e adicionar linhas, uma a uma . Qual é a melhor maneira de fazer isso?
Criei com sucesso um DataFrame vazio com:
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
Depois, posso adicionar uma nova linha e preencher um campo com:
res = res.set_value(len(res), 'qty1', 10.0)
Funciona, mas parece muito estranho: - / (falha ao adicionar valor da string)
Como posso adicionar uma nova linha ao meu DataFrame (com diferentes tipos de colunas)?
Respostas:
fonte
.loc
está referenciando a coluna de índice, portanto, se você estiver trabalhando com um DataFrame preexistente com um índice que não seja uma sequência contínua de números inteiros começando com 0 (como no seu exemplo),.loc
substituirá as linhas existentes ou inserirá linhas, ou crie lacunas no seu índice. Uma abordagem mais robusta (mas não infalível) para anexar um dataframe de tamanho diferente de zero existente seria:df.loc[df.index.max() + 1] = [randint(...
ou pré-preencher o índice como o @FooBar sugeriu.df.index.max()
énan
quando o DataFrame está vazio.df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
Caso você possa obter todos os dados para o quadro de dados antecipadamente, existe uma abordagem muito mais rápida do que anexar a um quadro de dados:
Eu tive uma tarefa semelhante para a qual o acréscimo a um quadro de dados linha por linha levou 30 minutos e a criação de um quadro de dados a partir de uma lista de dicionários concluídos em segundos.
fonte
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.
( pandas.pydata.org/pandas-docs/stable/… )Você poderia usar
pandas.concat()
ouDataFrame.append()
. Para detalhes e exemplos, consulte Mesclar, ingressar e concatenar .fonte
.loc
mecanismo que pode ser evitado, especialmente se você for cuidadoso.DataFrame.append()
, verifique se os dados da linha também são um DataFrame em primeiro lugar, não uma lista.Já faz muito tempo, mas eu também enfrentei o mesmo problema. E encontrei aqui muitas respostas interessantes. Então, eu estava confuso qual método usar.
No caso de adicionar muitas linhas ao dataframe, eu me interessava em acelerar o desempenho . Então, tentei os 4 métodos mais populares e verifiquei a velocidade deles.
ATUALIZADO EM 2019 usando novas versões de pacotes. Também atualizado após o comentário do @FooBar
DESEMPENHO DA VELOCIDADE
Resultados (em segundos):
Também obrigado a @krassowski pelo comentário útil - eu atualizei o código.
Então, eu uso adição através do dicionário para mim.
Código:
PS Creio que minha realização não é perfeita e talvez haja alguma otimização.
fonte
df2.index.max()
for.loc
desnecessariamente aumenta a complexidade computacional. Simplesdf2.loc[i] = ...
faria. Para mim, reduziu o tempo de 10s para 8.64sSe você souber o número de entradas ex ante, você deve pré-alocar o espaço também fornecendo o índice (usando o exemplo de dados de uma resposta diferente):
Comparação de velocidade
E - a partir dos comentários - com um tamanho de 6000, a diferença de velocidade se torna ainda maior:
fonte
fonte
Para anexar com eficiência, consulte Como adicionar uma linha extra a um dataframe do pandas e Setting With Enlargement .
Adicione linhas
loc/ix
nos dados do índice de chave não existentes . por exemplo :Ou:
fonte
Você pode anexar uma única linha como um dicionário usando a
ignore_index
opçãofonte
f.append(<stuff>)
cria um novo objeto, em vez de simplesmente acrescentar ao objeto atual no lugar, por isso, se você está tentando anexar a uma trama de dados em um script, você precisa dizerf = f.append(<stuff>)
Por uma questão de maneira pitônica, adicione aqui minha resposta:
fonte
Você também pode criar uma lista de listas e convertê-la em um quadro de dados -
dando
fonte
Esta não é uma resposta para a pergunta do OP, mas um exemplo de brinquedo para ilustrar a resposta do @ShikharDua acima da qual achei muito útil.
Embora esse fragmento seja trivial, nos dados reais eu tinha 1.000 linhas e muitas colunas e desejei poder agrupar por colunas diferentes e depois executar as estatísticas abaixo para mais de uma coluna de taget. Portanto, ter um método confiável para construir o quadro de dados uma linha por vez foi uma grande conveniência. Obrigado @ShikharDua!
fonte
Descobri uma maneira simples e agradável:
fonte
Você pode usar o objeto gerador para criar o Dataframe, que terá mais eficiência de memória na lista.
Para adicionar dados brutos ao DataFrame existente, você pode usar o método append.
fonte
Crie um novo registro (quadro de dados) e adicione a old_data_frame .
passar lista de valores e nomes de colunas correspondentes para criar um novo_record (data_frame)
fonte
Aqui está a maneira de adicionar / acrescentar uma linha em
pandas DataFrame
Pode ser usado para inserir / acrescentar uma linha no DataFrame de pandas vazios ou preenchidos
fonte
Em vez de uma lista de dicionários, como na resposta do ShikharDua, também podemos representar nossa tabela como um dicionário de listas , onde cada lista armazena uma coluna em ordem de linha, desde que conheçamos nossas colunas de antemão. No final, construímos nosso DataFrame uma vez.
Para colunas c e n linhas, isso usa 1 dicionário ec listas, versus 1 lista e n dicionários. O método da lista de dicionários tem cada dicionário armazenando todas as chaves e requer a criação de um novo dicionário para cada linha. Aqui, apenas anexamos as listas, que são tempo constante e teoricamente muito rápidas.
fonte
se você quiser adicionar uma linha no final, adicione-a como uma lista
fonte
Outra maneira de fazer isso (provavelmente não muito bom desempenho):
Você também pode aprimorar a classe DataFrame assim:
fonte
Simplifique. Tomando a lista como entrada, que será anexada como linha no quadro de dados: -
fonte
Tudo que você precisa é
loc[df.shape[0]]
ouloc[len(df)]
ou
fonte
Geralmente vemos a construção
df.loc[subscript] = …
a ser atribuída a uma linha do DataFrame. Mikhail_Sam publicou benchmarks contendo, entre outros, esse construto, bem como o método usando dict e criar DataFrame no final . Ele considerou o último o mais rápido de longe. Mas se substituirmos odf3.loc[i] = …
(com DataFrame pré-alocado) em seu código pordf3.values[i] = …
, o resultado será alterado significativamente, pois esse método terá um desempenho semelhante ao do dict. Portanto, devemos considerar com mais frequência o uso dedf.values[subscript] = …
. No entanto, observe que é.values
necessário um subscrito com base em zero, que pode ser diferente do DataFrame.index.fonte
# .loc with prealloc
), outro exemplo está na pergunta que eu tenho que comparar dados de cada linha de um DataFrame do Pandas com dados do restante das linhas, existe uma maneira de acelerar o cálculo ? e sua resposta aceita.pandas.DataFrame.append
DataFrame.append (próprio, outro, ignore_index = False, verifique a integridade = False, classifique = False) → 'DataFrame'
Com ignore_index definido como True:
fonte
Antes de adicionar uma linha, temos que converter o quadro de dados em dicionário. Você pode ver as chaves como colunas no quadro de dados e os valores das colunas são novamente armazenados no dicionário, mas a chave de cada coluna é o número do índice no quadro de dados. Essa ideia me fez escrever o código abaixo.
fonte
Você pode concatenar dois DataFrames para isso. Basicamente, deparei-me com esse problema para adicionar uma nova linha a um DataFrame existente com um índice de caracteres (não numérico). Então, insiro os dados para uma nova linha em um duto () e indexo em uma lista.
fonte
Isso cuidará da adição de um item a um DataFrame vazio. A questão é que,
df.index.max() == nan
para o primeiro índice:fonte