Ao excluir uma coluna em um DataFrame, eu uso:
del df['column_name']
E isso funciona muito bem. Por que não consigo usar o seguinte?
del df.column_name
Como é possível acessar a coluna / série como df.column_name
, eu esperava que isso funcionasse.
Respostas:
Como você adivinhou, a sintaxe correta é
É difícil fazer o
del df.column_name
trabalho simplesmente como resultado de limitações sintáticas no Python.del df[name]
é traduzido para odf.__delitem__(name)
abrigo por Python.fonte
class A(object): def __init__(self): self.var = 1
configura uma classe e depoisa = A(); del a.var
funciona muito bem ...del df[name]
, é traduzido paradf.__delitem__(name)
qual é um método que o DataFrame pode implementar e modificar de acordo com suas necessidades. No caso dedel df.name
, a variável membro é removida sem chance de execução de qualquer código personalizado. Considere o seu próprio exemplo - você podedel a.var
resultar em uma impressão de "exclusão de variável"? Se puder, por favor me diga como. Eu não posso :)pandas
desenvolvedores não , mas isso não significa que é difícil de fazer.A melhor maneira de fazer isso nos pandas é usar
drop
:onde
1
é o número do eixo (0
para linhas e1
colunas).Para excluir a coluna sem precisar reatribuir,
df
você pode:Finalmente, para soltar pelo número da coluna em vez do rótulo da coluna , tente excluir, por exemplo, a 1ª, a 2ª e a 4ª colunas:
Também trabalhando com a sintaxe "texto" para as colunas:
fonte
del
algum motivo?drop
maisdel
é quedrop
permite soltar várias colunas de uma só vez, realizar o inplace operação ou não, e também registos de exclusão ao longo de qualquer eixo (especialmente útil para uma matriz de 3-D ouPanel
)drop
overdel
é que o drop faz parte da API do pandas e contém documentação.Usar:
Isso excluirá uma ou mais colunas no local. Observe que
inplace=True
foi adicionado no pandas v0.13 e não funcionará em versões mais antigas. Você teria que atribuir o resultado novamente nesse caso:fonte
df.drop(list,inplace=True,axis=1)
del
- pode deixar cair mais de uma coluna ao mesmo tempo.Drop por índice
Exclua primeira, segunda e quarta colunas:
Exclua a primeira coluna:
Existe um parâmetro opcional
inplace
para que os dados originais possam ser modificados sem criar uma cópia.Popped
Seleção, adição e exclusão de colunas
Excluir coluna
column-name
:Exemplos:
print df
:df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:three = df.pop('three')
print df
:fonte
df.T.pop('A')
df
. Você poderia fazer,df = df.T; df.pop(index); df = df.T
mas isso parece excessivo.df.drop(df.columns[[0]], axis=1, inplace=True)
não seria suficiente usardf.drop([0], axis=1)
?0
,df.drop(0, axis=1)
funcione bem. Mas se você não sabe o nome da coluna e precisa remover a primeira colunadf.drop(df.columns[[0]], axis=1, inplace=True)
, selecione a primeira coluna por posição e solte-a.A pergunta real colocada, perdida pela maioria das respostas aqui é:
Por que não posso usar
del df.column_name
?A princípio, precisamos entender o problema, o que exige que mergulhemos nos métodos mágicos do python .
Como Wes aponta em sua resposta,
del df['column']
mapeia o método mágico pythondf.__delitem__('column')
que é implementado nos pandas para soltar a colunaNo entanto, conforme apontado no link acima sobre métodos mágicos python :
Você pode argumentar que
del df['column_name']
não deve ser usado ou incentivado e, portantodel df.column_name
, nem deve ser considerado.Contudo, em teoria,
del df.column_name
poderia ser implementado para trabalhar em pandas usando o método mágico__delattr__
. No entanto, isso introduz certos problemas, problemas que adel df['column_name']
implementação já possui, mas em menor grau.Problema de exemplo
E se eu definir uma coluna em um dataframe chamado "dtypes" ou "columns".
Então suponha que eu queira excluir essas colunas.
del df.dtypes
faria o__delattr__
confundiria método como se fosse excluir o atributo "dtypes" ou a coluna "dtypes".Questões arquitetônicas por trás desse problema
Pandas respostas:
.ix
,.loc
ou.iloc
métodos .TLDR;
Você não pode fazer isso
del df.column_name
porque os pandas têm uma arquitetura bastante desenvolvida que precisa ser reconsiderada para que esse tipo de dissonância cognitiva não ocorra aos seus usuários.Protip:
Não use df.column_name, pode ser bonito, mas causa dissonância cognitiva
Citações de Zen of Python que se encaixam aqui:
Existem várias maneiras de excluir uma coluna.
Às vezes, colunas são atributos, mas às vezes não.
Exclui
del df.dtypes
o atributo dtypes ou a coluna dtypes?fonte
__del__
quase nunca deve ser usado por causa das circunstâncias precárias sob as quais é chamado; use-o com cautela!" é completamente irrelevante aqui, como é o método usado aqui__delattr__
.del
significado interno, não o.__del__
método da instância. Odel
embutido está mapeando para__delattr__
e__delitem__
que é o que eu estou construindo o meu argumento sobre. Então, talvez você queira reler o que eu escrevi.__
...__
é interpretado como marcação em negrito por StackExchangeUma boa adição é a capacidade de descartar colunas apenas se elas existirem . Dessa forma, você pode cobrir mais casos de uso, e isso eliminará apenas as colunas existentes dos rótulos passados para ele:
Basta adicionar erros = 'ignorar' , por exemplo:
fonte
da versão 0.16.1 você pode fazer
fonte
errors= 'ignore'
)df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')
, se tal aplicativo for desejado!É uma boa prática usar sempre a
[]
notação. Um motivo é que o atributo notation (df.column_name
) não funciona para índices numerados:fonte
Pandas 0.21+ resposta
A versão 0.21 do Pandas mudou um
drop
pouco o método para incluir os parâmetrosindex
ecolumns
para corresponder à assinatura dos métodosrename
ereindex
.Pessoalmente, prefiro usar o
axis
parâmetro para denotar colunas ou índices, porque é o parâmetro de palavra-chave predominante usado em quase todos os métodos de pandas. Mas agora você tem algumas opções adicionais na versão 0.21.fonte
No pandas 0.16.1+, você pode descartar colunas apenas se elas existirem, de acordo com a solução postada por @eiTanLaVi. Antes dessa versão, você pode obter o mesmo resultado através da compreensão de uma lista condicional:
fonte
TL; DR
Muito esforço para encontrar uma solução marginalmente mais eficiente. Difícil justificar a complexidade adicional, sacrificando a simplicidade de
df.drop(dlst, 1, errors='ignore')
Preâmbulo
Excluir uma coluna é semanticamente o mesmo que selecionar as outras colunas. Vou mostrar alguns métodos adicionais a serem considerados.
Também focarei na solução geral de excluir várias colunas de uma só vez e permitir a tentativa de excluir colunas que não estão presentes.
O uso dessas soluções é geral e também funcionará no caso simples.
Instalação
Considere a
pd.DataFrame
df
lista e para excluirdlst
O resultado deve se parecer com:
Como estou equiparando a exclusão de uma coluna à seleção das outras colunas, dividirei-a em dois tipos:
Seleção de etiqueta
Começamos fabricando a lista / matriz de rótulos que representam as colunas que queremos manter e sem as colunas que queremos excluir.
df.columns.difference(dlst)
np.setdiff1d(df.columns.values, dlst)
df.columns.drop(dlst, errors='ignore')
list(set(df.columns.values.tolist()).difference(dlst))
[x for x in df.columns.values.tolist() if x not in dlst]
Colunas dos rótulos
Para comparar o processo de seleção, assuma:
Então podemos avaliar
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
Quais todos avaliam para:
Fatia booleana
Podemos construir uma matriz / lista de booleanos para fatiar
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
Colunas do Booleano
Para fins de comparação
df.loc[: bools]
Quais todos avaliam para:
Tempo robusto
Funções
Teste
Isso é relativo ao tempo que leva para executar
df.drop(dlst, 1, errors='ignore')
. Parece que depois de todo esse esforço, apenas melhoramos o desempenho modestamente.Se fato as melhores soluções usam
reindex
oureindex_axis
no hacklist(set(df.columns.values.tolist()).difference(dlst))
. Um segundo próximo e ainda muito marginalmente melhor do quedrop
énp.setdiff1d
.fonte
A sintaxe do ponto funciona em JavaScript, mas não em Python.
del df['column_name']
del df['column_name']
oudel df.column_name
fonte
Se o seu quadro de dados original
df
não for muito grande, você não terá restrições de memória e precisará manter apenas algumas colunas, poderá criar um novo quadro de dados apenas com as colunas de que precisa:fonte
Podemos remover ou excluir uma coluna especificada ou colunas sprcified por drop () método .
Suponha df seja um quadro de dados.
Coluna a ser removida = column0
Para remover várias colunas col1, col2,. . . , coln, precisamos inserir todas as colunas que precisavam ser removidas em uma lista. Em seguida, remova-os pelo método drop ().
Espero que seja útil.
fonte
df = df.drop([col1, col2, . . . , coln], axis=1)
isso não funciona se eu especificar um nome de variável no lugar de col1, col2 etc. Recebo a coluna de erro que não está no eixo quando está definitivamente presente. @Littin Você poderia ajudar?Outra maneira de excluir uma coluna no Pandas DataFrame
se você não estiver procurando pela exclusão no local, poderá criar um novo DataFrame especificando as colunas usando a
DataFrame(...)
função comoCrie um novo DataFrame como
Você obtém um resultado tão bom quanto o obtido com del / drop
fonte