Eu sou novo em pandas e estou tentando descobrir como adicionar várias colunas a pandas simultaneamente. Qualquer ajuda aqui é apreciada. Idealmente, gostaria de fazer isso em uma etapa, em vez de várias etapas repetidas ...
import pandas as pd
df = {'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here...
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
Respostas:
Eu esperava que sua sintaxe funcionasse também. O problema surge porque quando você cria novas colunas com a sintaxe da lista de colunas (
df[[new1, new2]] = ...
), o pandas requer que o lado direito seja um DataFrame (note que na verdade não importa se as colunas do DataFrame têm os mesmos nomes que as colunas você está criando).Sua sintaxe funciona bem para atribuir valores escalares a colunas existentes , e o pandas também fica feliz em atribuir valores escalares a uma nova coluna usando a sintaxe de coluna única (
df[new1] = ...
). Portanto, a solução é converter isso em várias atribuições de coluna única ou criar um DataFrame adequado para o lado direito.Aqui estão algumas abordagens que irá trabalhar:
Em seguida, um dos seguintes:
1) Três atribuições em uma, usando a descompactação de lista:
2)
DataFrame
expande convenientemente uma única linha para corresponder ao índice, para que você possa fazer o seguinte:3) Faça um quadro de dados temporário com novas colunas, depois combine com o quadro de dados original:
4) Semelhante ao anterior, mas usando em
join
vez deconcat
(pode ser menos eficiente):5) Usar um dict é uma maneira mais "natural" de criar o novo quadro de dados do que os dois anteriores, mas as novas colunas serão classificadas em ordem alfabética (pelo menos antes do Python 3.6 ou 3.7 ):
6) Use
.assign()
com vários argumentos de coluna.Gosto muito dessa variante da resposta de @zero, mas, como a anterior, as novas colunas sempre serão classificadas em ordem alfabética, pelo menos com as primeiras versões do Python:
7) Isso é interessante (com base em https://stackoverflow.com/a/44951376/3830997 ), mas não sei quando valeria a pena:
8) No final, é difícil vencer três atribuições separadas:
Nota: muitas dessas opções já foram abordadas em outras respostas: Adicionar várias colunas ao DataFrame e defini-las iguais a uma coluna existente . É possível adicionar várias colunas de uma vez a um DataFrame do pandas? , Adicionar várias colunas vazias ao DataFrame do pandas
fonte
.reindex
) não alteraria o índice do dataframe? Por que alguém iria querer alterar desnecessariamente o índice ao adicionar colunas, a menos que seja uma meta explícita ....reindex()
é usado com ocolumns
argumento, portanto, ele apenas altera a coluna "índice" (nomes). Não altera o índice da linha.OrderedDict
: por exemplo,df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})
vs.df = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
join
, certifique-se de não ter duplicatas em seu índice (ou use umreset_index
primeiro). Pode poupar algumas horas na depuração.Você pode usar
assign
com um dicionário de nomes e valores de coluna.fonte
df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
Com o uso de concat :
Não tenho muita certeza do que você queria fazer
[np.nan, 'dogs',3]
. Talvez agora os defina como valores padrão?fonte
uso de compreensão de lista,
pd.DataFrame
epd.concat
fonte
se adicionar muitas colunas ausentes (a, b, c, ....) com o mesmo valor, aqui 0, fiz o seguinte:
É baseado na segunda variante da resposta aceita.
fonte
Só quero apontar essa opção2 na resposta de @Matthias Fripp
já está documentado na própria documentação do pandas http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
fonte
pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
replica a única linha fornecida para criar um dataframe inteiro com o mesmo comprimento do índice.Se você quiser apenas adicionar novas colunas vazias, o reindex fará o trabalho
exemplo de código completo
caso contrário vá para zeros responder com atribuir
fonte
Não me sinto confortável usando "Índice" e assim por diante ... poderia aparecer como abaixo
fonte