Adicionar coluna ao quadro de dados com valor constante


187

Eu tenho um quadro de dados existente e preciso adicionar uma coluna adicional à qual conterá o mesmo valor para cada linha.

Df existente:

Date, Open, High, Low, Close
01-01-2015, 565, 600, 400, 450

Novo df:

Name, Date, Open, High, Low, Close
abc, 01-01-2015, 565, 600, 400, 450

Eu sei como acrescentar uma coluna existente de série / quadro de dados. Mas essa é uma situação diferente, porque tudo o que preciso é adicionar a coluna 'Nome' e definir cada linha com o mesmo valor, neste caso 'abc'.

Respostas:


295

df['Name']='abc' adicionará a nova coluna e definirá todas as linhas para esse valor:

In [79]:

df
Out[79]:
         Date, Open, High,  Low,  Close
0  01-01-2015,  565,  600,  400,    450
In [80]:

df['Name'] = 'abc'
df
Out[80]:
         Date, Open, High,  Low,  Close Name
0  01-01-2015,  565,  600,  400,    450  abc

35
Existe alguma outra maneira de fazer isso? Estou recebendo o seguinte aviso. Um valor está tentando ser definido em uma cópia de uma fatia de um DataFrame. Tente usar .loc [index_indexer, index_col] abaixo = value. Veja as advertências na documentação: pandas.pydata.org/pandas-docs/stable/…
vishnu viswanath

3
Isso significa que você está atribuindo algo que é uma cópia e não o df original. Não posso comentar mais sem ver os dados e o seu código na forma de uma pergunta. Responder a perguntas nos comentários é contraproducente. Este código funciona, você fez algo antes disso para elevar o aviso
EdChum

@vishnuviswanath Recebo exatamente o mesmo aviso que você quando uso o Jupyter Notebook. Acontece comigo quando tenho tamanhos não triviais do DataFrame (> 200 registros) e certas combinações de atribuição e simplesmente imprimo o df.
Bill

4
@vishnuviswanath você provavelmente criou uma fatia do quadro de dados original antes disso e depois tentou definir a nova coluna nessa fatia. Adicione a nova coluna ao dataframe original e crie a fatia depois disso. Provavelmente, quando você cria uma fatia de um quadro de dados, o pandas não cria uma cópia e, de alguma forma, a gerencia a partir do quadro de dados original. Isso meio que mexe com essa otimização e, portanto, com o aviso.
Amit_saxena

2
Para solucionar o aviso de pandas mencionado, basta obter uma cópia do dataframe usando .copy()antes de usá-lo (a menos que seja enorme ou algo ou desempenho realmente conte).
matanster

61

Você pode usar insertpara especificar onde deseja que a nova coluna esteja. Nesse caso, eu uso 0para colocar a nova coluna à esquerda.

df.insert(0, 'Name', 'abc')

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450

Isso não funciona para mim. Minha matriz original é 1460 x 41 e eu estou tentando adicionar uma coluna de 1s à frente: df.insert(0,'coef_fix',1). Estou usando o JupyterLab com Python 3.0
ColinMac

2
Funciona bem para mim. Você pode não ter percebido que insertfunciona inplace. Isso significa que o valor do novo quadro de dados não é retornado, mas o quadro de dados original foi modificado. Tente issodf = pd.DataFrame(0, range(1460), range(41)); df.insert(0, 'coef_fix', 1); df
piRSquared

44

Obras de revestimento único

df['Name'] = 'abc'

Cria uma Namecoluna e define todas as linhas como abcvalor


41

Resumindo o que os outros sugeriram e adicionando uma terceira maneira

Você pode:

  • atribuir (** kwargs) :

    df.assign(Name='abc')
  • acesse a nova série de colunas (será criada) e defina-a:

    df['Name'] = 'abc'
  • inserir (local, coluna, valor, allow_duplicates = False)

    df.insert(0, 'Name', 'abc')

    onde o argumento loc (0 <= loc <= len (colunas)) permite inserir a coluna onde você deseja.

    'loc' fornece o índice em que sua coluna estará após a inserção. Por exemplo, o código acima insere a coluna Nome como a coluna 0, ou seja, será inserida antes da primeira coluna, tornando-se a nova primeira coluna. (A indexação começa em 0).

Todos esses métodos também permitem adicionar uma nova coluna de uma série (basta substituir o argumento padrão 'abc' acima pela série).

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.