Como adicionar uma coluna vazia a um quadro de dados?

262

Qual é a maneira mais fácil de adicionar uma coluna vazia a um DataFrameobjeto pandas ? O melhor que eu encontrei é algo como

df['foo'] = df.apply(lambda _: '', axis=1)

Existe um método menos perverso?

kjo
fonte
2
Deseja realmente uma coluna contendo cadeias vazias ou melhor N/A?
filmor

Respostas:

420

Se bem entendi, a tarefa deve preencher:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
DSM
fonte
2
Esta resposta acabou de criar novas linhas para mim.
logicbloke
@logicbloke você pode dar um exemplo de onde isso está acontecendo?
craymichael
@craymichael Já faz um tempo, mas acredito que tinha colunas indexadas em número sem nomes e com linhas nomeadas e isso acabou de criar uma nova linha no final.
logicbloke
1
Se o dfestá vazia, você pode querer usar df['new'] = pd.Series() (ver minha resposta abaixo)
Carsten
como adicionar várias colunas vazias?
M. Mariscal
46

Para adicionar à resposta do DSM e desenvolver essa pergunta associada , dividiria a abordagem em dois casos:

  • Adicionando uma única coluna: Basta atribuir valores vazios às novas colunas, por exemplo df['C'] = np.nan

  • Adicionando várias colunas: sugiro usar o .reindex(columns=[...]) método pandas para adicionar as novas colunas ao índice de colunas do quadro de dados. Isso também funciona para adicionar várias novas linhas com .reindex(rows=[...]). Observe que as versões mais recentes do Pandas (v> 0.20) permitem especificar uma axispalavra - chave em vez de atribuir explicitamente a columnsou rows.

Aqui está um exemplo de adição de várias colunas:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

ou

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Você também pode sempre concatenar um novo quadro de dados (vazio) para o quadro de dados existente, mas isso não parece tão pitônico para mim :)

emunsing
fonte
3
Exemplo para version >= 0.20.0exclui o DataFrame e adiciona as novas colunas como linhas. Exemplo para version < 0.20.0funciona bem na versão Pandas0.24.1
Lalo
@emunsing Ao procurar uma resposta para essa pergunta, achei sua resposta útil. No início, no entanto, não foi trabalhar para mim como Pandas requer , axis=1no version = 0.25. Tentei modificar sua resposta para incluir a versão atualizada, mas fui rejeitado por @kenlukas e @il_raffa. Espero que todos que lutam para entender por que sua resposta não está funcionando para eles - como eu estava - pelo menos se deparem com esse comentário.
Griff
@Griff - Atualizei minha resposta para ser mais preciso e explícito sobre problemas de compatibilidade de versões. Obrigado por destacar isso.
emunsing 26/11/19
35

uma solução ainda mais simples é:

df = df.reindex(columns = header_list)                

onde "header_list" é uma lista dos cabeçalhos que você deseja que apareça.

qualquer cabeçalho incluído na lista que ainda não foi encontrado no quadro de dados será adicionado com as células em branco abaixo.

então se

header_list = ['a','b','c', 'd']

c e d serão adicionados como colunas com células em branco

liana
fonte
2
Mais precisamente, as colunas serão adicionadas com NaNs.
Broccoli2000
19

Começando com v0.16.0, DF.assign()poderia ser usado para atribuir novas colunas ( únicas / múltiplas ) a a DF. Essas colunas são inseridas em ordem alfabética no final do DF.

Isso se torna vantajoso em comparação com a atribuição simples nos casos em que você deseja executar uma série de operações encadeadas diretamente no dataframe retornado.

Considere o mesmo DFexemplo demonstrado pelo @DSM:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Observe que isso retorna uma cópia com todas as colunas anteriores, juntamente com as recém-criadas. Para que o original DFseja modificado de acordo, use-o como: df = df.assign(...)pois ele não suporta a inplaceoperação atualmente.

Nickil Maveli
fonte
Qual é esse tipo de dados para C? Estou tentando adicionar fazendo um loop através de uma lista de seqüências de caracteres. Mas não o usa.
eleijonmarck
12

Eu gosto:

df['new'] = pd.Series(dtype='your_required_dtype')

Se você possui um quadro de dados vazio, esta solução garante que nenhuma nova linha contendo apenas NaNseja adicionada.

Se dtypenão for especificado, as versões mais recentes do Pandas produzirão a DeprecationWarning.

Carsten
fonte
5

se você deseja adicionar o nome da coluna de uma lista

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan
Joy Mazumder
fonte
4

A resposta do @ emunsing é muito legal para adicionar várias colunas, mas não consegui fazê-lo funcionar no python 2.7. Em vez disso, achei que isso funciona:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
maleta
fonte
1

O código abaixo aborda a pergunta "Como adiciono n número de colunas vazias ao meu quadro de dados existente". No interesse de manter soluções para problemas semelhantes em um só lugar, estou adicionando aqui.

Abordagem 1 (para criar 64 colunas adicionais com nomes de colunas de 1 a 64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Abordagem 2 (para criar 64 colunas adicionais com nomes de colunas de 1 a 64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')
moys
fonte
1

Você pode fazer

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 
Bharath_Raja
fonte
1

Pode-se usar df.insert(index_to_insert_at, column_header, init_value)para inserir nova coluna em um índice específico.

cost_tbl.insert(1, "col_name", "") 

A instrução acima inserirá uma coluna vazia após a primeira coluna.

Usman Ahmad
fonte