Eu tenho um dataframe:
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
A B C
0 5 6 7
1 7 8 9
[2 rows x 3 columns]
e preciso adicionar uma primeira linha [2, 3, 4] para obter:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
Tentei o append()
e concat()
funções, mas não consigo encontrar a maneira certa de como fazer isso.
Como adicionar / inserir séries no dataframe?
s1.values
em vez delist(s1)
criar uma lista totalmente nova usandolist(s1)
.Respostas:
Basta atribuir uma linha a um índice específico, usando
loc
:E você obtém, conforme desejado:
Veja na documentação do Pandas Indexação: Configuração com ampliação .
fonte
df.loc[-1] = df.iloc[[0]]
, e inseri-la? O quadro vem com uma coluna de índice adicionada com erroValueError: cannot set a row with mismatched columns
(consulte stackoverflow.com/questions/47340571/… )df.loc[-1] = [2, 3, 4] # adding a row
é um pouco enganador, já que-1
não é a última linha / elemento, como é para arrays Python.Não tenho certeza de como você estava chamando,
concat()
mas deve funcionar, desde que ambos os objetos sejam do mesmo tipo. Talvez o problema seja que você precisa lançar seu segundo vetor para um dataframe? Usar o df que você definiu funciona para mim:fonte
Uma maneira de conseguir isso é
Geralmente, é mais fácil anexar dataframes, não séries. No seu caso, como você deseja que a nova linha esteja "no topo" (com id inicial) e não haja nenhuma função
pd.prepend()
, primeiro crio o novo dataframe e, em seguida, acrescento o antigo.ignore_index
irá ignorar o índice antigo em andamento em seu dataframe e garantir que a primeira linha realmente comece com índice em1
vez de reiniciar com índice0
.Isenção de responsabilidade típica: Cetero censeo ... anexar linhas é uma operação bastante ineficiente. Se você se preocupa com o desempenho e pode, de alguma forma, garantir primeiro a criação de um dataframe com o índice correto (mais longo) e, em seguida, apenas inserir a linha adicional no dataframe, você definitivamente deve fazer isso. Vejo:
Até agora, temos o que você tinha como
df
:Mas agora você pode inserir facilmente a linha da seguinte maneira. Como o espaço foi pré-alocado, isso é mais eficiente.
fonte
Eu criei uma função curta que permite um pouco mais de flexibilidade ao inserir uma linha:
que poderia ser ainda mais abreviado para:
Então você pode usar algo como:
onde
2
é a posição do índicedf
onde você deseja inserirdf_new
.fonte
Podemos usar
numpy.insert
. Isso tem a vantagem de flexibilidade. Você só precisa especificar o índice no qual deseja inserir.Pois
np.insert(df.values, 0, values=[2, 3, 4], axis=0)
, 0 indica à função o local / índice em que você deseja colocar os novos valores.fonte
isso pode parecer muito simples, mas é incrível que uma função simples de inserir nova linha não esteja embutida. Eu li muito sobre anexar um novo df ao original, mas estou me perguntando se isso seria mais rápido.
fonte
Abaixo está a melhor maneira de inserir uma linha no dataframe do pandas sem classificar e redefinir um índice:
fonte
É muito simples adicionar uma linha em um pandas
DataFrame
:Crie um dicionário Python regular com os mesmos nomes de colunas que o seu
Dataframe
;Use o
pandas.append()
método e passe o nome do seu dicionário, onde.append()
é um método nas instâncias do DataFrame;Adicione
ignore_index=True
logo após o nome do dicionário.fonte
concat()
parece ser um pouco mais rápido do que a inserção e reindexação da última linha. Caso alguém se pergunte sobre a velocidade das duas principais abordagens:17,1 s ± 705 ms por loop (média ± desvio padrão de 7 execuções, 1 loop cada)
6,53 s ± 127 ms por loop (média ± desvio padrão de 7 execuções, 1 loop cada)
fonte
Você pode simplesmente anexar a linha ao final do DataFrame e, em seguida, ajustar o índice.
Por exemplo:
Ou use
concat
como:fonte
A maneira mais simples de adicionar uma linha em um quadro de dados do pandas é:
Exemplo:
NB: o comprimento da sua lista deve corresponder ao do quadro de dados.
fonte