Eu tenho um DataFrame usando pandas e rótulos de coluna que preciso editar para substituir os rótulos originais da coluna.
Gostaria de alterar os nomes das colunas em um DataFrame A
onde os nomes das colunas originais são:
['$a', '$b', '$c', '$d', '$e']
para
['a', 'b', 'c', 'd', 'e'].
Tenho os nomes das colunas editadas armazenados em uma lista, mas não sei como substituir os nomes das colunas.
Respostas:
Basta atribuí-lo ao
.columns
atributo:fonte
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.rename(columns = {'$b':'B'}, inplace = True)
RENOMEAR COLUNAS ESPECÍFICAS
Use a
df.rename()
função e consulte as colunas a serem renomeadas. Nem todas as colunas precisam ser renomeadas:Exemplo de código mínimo
Os seguintes métodos funcionam e produzem a mesma saída:
Lembre-se de atribuir o resultado de volta, pois a modificação não está no local. Como alternativa, especifique
inplace=True
:Na v0.25, você também pode especificar
errors='raise'
para gerar erros se uma coluna para renomear inválida for especificada. Consulte os documentos v0.25rename()
.REASSIGN HEADERS DA COLUNA
Use
df.set_axis()
comaxis=1
einplace=False
(para retornar uma cópia).Isso retorna uma cópia, mas você pode modificar o DataFrame no local, definindo
inplace=True
(esse é o comportamento padrão para as versões <= 0,24, mas provavelmente será alterado no futuro).Você também pode atribuir cabeçalhos diretamente:
fonte
code
<class 'pandas.core.frame.DataFrame'> Int64Index: 1000 entradas, 0 a 999 colunas de dados: BodyMarkdown 1000 não nuloscode
obras , mas quando eu faço o dataframe.head () os nomes antigos das colunas reaparecem.SettingWithCopyWarning:
quando uso o segundo trecho de código nesta resposta.df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
altera o nome exibido, mas não os elementos na estrutura de dados subjacente. Portanto, se você tentar,df['newName1']
receberá um erro. Oinplace=True
é necessário para evitar que gotchya.O
rename
método pode assumir uma função , por exemplo:fonte
df.rename(columns=lambda x: x.lstrip(), inplace=True)
t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)
é uma jóia para que possamos escrever emdf.Column_1_Name
vez de escreverdf.loc[:, 'Column 1 Name']
.Conforme documentado em Trabalhando com Dados de Texto :
fonte
Pandas 0.21+ Answer
Houve algumas atualizações significativas na renomeação de colunas na versão 0.21.
rename
método adicionou oaxis
parâmetro que pode ser definido comocolumns
ou1
. Esta atualização faz esse método corresponder ao restante da API do pandas. Ele ainda possui os parâmetrosindex
e,columns
mas você não é mais obrigado a usá-los.set_axis
método com oinplace
conjunto deFalse
permite renomear todos os rótulos de índice ou coluna com uma lista.Exemplos para Pandas 0.21+
Exemplo de construção DataFrame:
Usando
rename
comaxis='columns'
ouaxis=1
ou
Ambos resultam no seguinte:
Ainda é possível usar a assinatura do método antigo:
A
rename
função também aceita funções que serão aplicadas a cada nome de coluna.ou
Usando
set_axis
com uma lista einplace=False
Você pode fornecer uma lista para o
set_axis
método de comprimento igual ao número de colunas (ou índice). Atualmente, oinplace
padrão éTrue
, masinplace
será padronizadoFalse
em versões futuras.ou
Por que não usar
df.columns = ['a', 'b', 'c', 'd', 'e']
?Não há nada errado em atribuir colunas diretamente assim. É uma solução perfeitamente boa.
A vantagem do uso
set_axis
é que ele pode ser usado como parte de uma cadeia de métodos e retorna uma nova cópia do DataFrame. Sem ele, você teria que armazenar suas etapas intermediárias da cadeia em outra variável antes de reatribuir as colunas.fonte
Pandas 0.21+ answer
- de alguma forma eu perdi essa parte no "o que é novo" parte ...(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
Como você deseja remover apenas o sinal de $ em todos os nomes de coluna, basta:
OU
fonte
Ele substituirá os nomes existentes pelos nomes que você fornecer, na ordem que você fornecer.
fonte
df.columns.values
, isso está errado. stackoverflow.com/questions/43291781/…Dessa forma, você pode editar manualmente o
new_names
que desejar. Funciona muito bem quando você precisa renomear apenas algumas colunas para corrigir erros ortográficos, acentos, remover caracteres especiais etc.fonte
df.columns = ['a', 'b', 'c', 'd', 'e']
é mais simples.df.columns.values
para obter os nomes antigos.myList = list(df) myList[10:20]
:, etc - então isso é perfeito.namez = df.columns.values
seguidos de algumas ediçõesdf.columns = namez
.Soluções de uma linha ou pipeline
Vou me concentrar em duas coisas:
OP afirma claramente
Não quero resolver o problema de como substituir
'$'
ou remover o primeiro caractere de cada cabeçalho da coluna. O OP já executou esta etapa. Em vez disso, quero focar na substituição docolumns
objeto existente por um novo, com uma lista de nomes de colunas de substituição.df.columns = new
ondenew
está a lista de novos nomes de colunas é o mais simples possível. A desvantagem dessa abordagem é que ela requer edição docolumns
atributo do quadro de dados existente e isso não é feito em linha. Mostrarei algumas maneiras de fazer isso via pipelining sem editar o quadro de dados existente.Configuração 1
Para focar na necessidade de renomear os nomes de colunas substituídos por uma lista preexistente, criarei um novo dataframe de amostra
df
com nomes de colunas iniciais e novos nomes de colunas não relacionados.Solução 1
pd.DataFrame.rename
Já foi dito que, se você tivesse um dicionário mapeando os nomes das colunas antigas para os novos, poderia usar
pd.DataFrame.rename
.No entanto, você pode criar facilmente esse dicionário e incluí-lo na chamada para
rename
. A seguir, aproveita-se o fato de que, quando iteramosdf
, iteramos sobre o nome de cada coluna.Isso funciona muito bem se os nomes das colunas originais forem exclusivos. Mas, se não estiverem, isso será interrompido.
Configurar 2
colunas não exclusivas
Solução 2
pd.concat
usando okeys
argumentoPrimeiro, observe o que acontece quando tentamos usar a solução 1:
Não mapeamos a
new
lista como os nomes das colunas. Acabamos repetindoy765
. Em vez disso, podemos usar okeys
argumento dapd.concat
função enquanto iteramos pelas colunas dedf
.Solução 3
Reconstrua. Isso só deve ser usado se você tiver um único
dtype
para todas as colunas. Caso contrário, você terminará comdtype
object
todas as colunas e convertê-las novamente exige mais trabalho de dicionário.solteiro
dtype
Misturado
dtype
Solução 4
Este é um truque enigmático com
transpose
eset_index
.pd.DataFrame.set_index
permite definir um índice em linha, mas não há correspondênciaset_columns
. Então podemos transpor, entãoset_index
, e transpor de volta. No entanto, a mesma ressalva únicadtype
versus mistadtype
da solução 3 se aplica aqui.solteiro
dtype
Misturado
dtype
Solução 5
Use a
lambda
empd.DataFrame.rename
que percorre cada elemento denew
Nesta solução, passamos um lambda que leva,
x
mas depois o ignora. Também é preciso,y
mas não o espera. Em vez disso, um iterador é fornecido como um valor padrão e eu posso usá-lo para percorrer um de cada vez, sem levar em conta qual é o valorx
.E, como me foi indicado pelo pessoal do chat do sopython , se eu adicionar um
*
entrex
ey
, posso proteger minhay
variável. Porém, neste contexto, não acredito que precise ser protegido. Ainda vale a pena mencionar.fonte
df.rename(lambda x : x.lstrip('$'),axis=1)
x
é ignorado?Nomes de colunas vs nomes de séries
Eu gostaria de explicar um pouco o que acontece nos bastidores.
Os quadros de dados são um conjunto de séries.
As séries, por sua vez, são uma extensão de um
numpy.array
numpy.array
s tem uma propriedade.name
Este é o nome da série. Raramente os pandas respeitam esse atributo, mas permanecem em alguns lugares e podem ser usados para invadir alguns comportamentos dos pandas.
Nomeando a lista de colunas
Muitas respostas aqui falam sobre o
df.columns
atributo serlist
quando, na verdade, é umSeries
. Isso significa que ele tem um.name
atributo.É o que acontece se você decidir preencher o nome das colunas
Series
:Observe que o nome do índice sempre vem uma coluna abaixo.
Artefatos que permanecem
O
.name
atributo permanece algumas vezes. Se você definir,df.columns = ['one', 'two']
entãodf.one.name
será'one'
.Se você definir
df.one.name = 'three'
,df.columns
ainda lhe dará['one', 'two']
edf.one.name
lhe dará'three'
MAS
pd.DataFrame(df.one)
retornaráPorque os pandas reutilizam o
.name
dos já definidosSeries
.Nomes de colunas em vários níveis
O Pandas tem maneiras de criar nomes de colunas em várias camadas. Não há muita mágica envolvida, mas eu queria cobrir isso na minha resposta também, já que não vejo ninguém percebendo isso aqui.
Isso é facilmente possível definindo colunas em listas, assim:
fonte
Se você possui o quadro de dados, o df.columns despeja tudo em uma lista que você pode manipular e depois reatribuir no quadro de dados como os nomes das colunas ...
Melhor maneira? SEI LÁ. Um caminho - sim.
Uma maneira melhor de avaliar todas as principais técnicas apresentadas nas respostas à pergunta é a seguir, usando o cProfile para medir a memória e o tempo de execução. @kadee, @kaitlyn e @eumiro tiveram as funções com os tempos de execução mais rápidos - embora essas funções sejam tão rápidas que estamos comparando o arredondamento de 0,000 e 0,001 segundos para todas as respostas. Moral: minha resposta acima provavelmente não é a melhor maneira.
fonte
Digamos que este seja seu quadro de dados.
Você pode renomear as colunas usando dois métodos.
Usando
dataframe.columns=[#list]
A limitação desse método é que, se uma coluna precisar ser alterada, a lista completa de colunas deverá ser passada. Além disso, esse método não é aplicável aos rótulos de índice. Por exemplo, se você passou isso:
Isso gerará um erro. Incompatibilidade de comprimento: o eixo esperado possui 5 elementos, novos valores possuem 4 elementos.
Outro método é o
rename()
método Pandas , usado para renomear qualquer índice, coluna ou linhaDa mesma forma, você pode alterar qualquer linha ou coluna.
fonte
Se sua nova lista de colunas estiver na mesma ordem que as colunas existentes, a atribuição será simples:
Se você tivesse um dicionário digitado em nomes de colunas antigos para novos, você poderia fazer o seguinte:
Se você não possui um mapeamento de lista ou dicionário, pode retirar o
$
símbolo principal por meio de uma compreensão da lista:fonte
lambda col: d[col]
você poder passard.get
... assim seria parecido comdf.columns.map(d.get)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
fonte
Vamos entender a renomeação por um pequeno exemplo ...
1. Renomeando colunas usando o mapeamento:
Renomear índice / Nome_da_Rota usando o mapeamento:
fonte
Outra maneira de substituir os rótulos das colunas originais é removendo os caracteres indesejados (aqui '$') dos rótulos das colunas originais.
Isso poderia ter sido feito executando um loop for sobre o df.columns e anexando as colunas removidas ao df.columns.
Em vez disso, podemos fazer isso ordenadamente em uma única declaração usando a compreensão de lista como abaixo:
(o
strip
método em Python retira o caractere fornecido do início e do fim da string.)fonte
Muito simples, basta usar
e atribuirá os nomes das colunas pela ordem em que você os colocou
fonte
Você poderia usar
str.slice
para isso:fonte
df.columns.str[1:]
... provavelmente é melhor usá-lo, é mais curto e mais óbvio.Eu sei que esta pergunta e resposta foram mastigadas até a morte. Mas eu me referi a ele como inspiração para um dos problemas que eu estava tendo. Eu era capaz de resolvê-lo usando pedaços de respostas diferentes, fornecendo minha resposta caso alguém precisasse.
Meu método é genérico, no qual você pode adicionar delimitadores adicionais separando vírgulas
delimiters=
variável e preparando-o para o futuro.Código de trabalho:
Resultado:
fonte
Observe que essas abordagens não funcionam para um MultiIndex. Para um MultiIndex, você precisa fazer algo como o seguinte:
fonte
Outra opção é renomear usando uma expressão regular:
fonte
Se você precisar lidar com um monte de colunas nomeadas pelo sistema de fornecimento fora de seu controle, criei a seguinte abordagem, que é uma combinação de uma abordagem geral e substituições específicas de uma só vez.
Primeiro, crie um dicionário a partir dos nomes das colunas do quadro de dados usando expressões regex para descartar certos apêndices de nomes de colunas e, em seguida, adicione substituições específicas ao dicionário para nomear as colunas principais conforme o esperado posteriormente no banco de dados de recebimento.
Isso é aplicado ao quadro de dados de uma só vez.
fonte
Além da solução já fornecida, você pode substituir todas as colunas enquanto estiver lendo o arquivo. Nós podemos usar
names
eheader=0
fazer isso.Primeiro, criamos uma lista dos nomes que gostamos de usar como nomes de coluna:
Nesse caso, todos os nomes de colunas serão substituídos pelos nomes que você tem na sua lista.
fonte
Aqui está uma pequena função bacana que eu gosto de usar para reduzir a digitação:
Aqui está um exemplo de como funciona:
fonte
Renomear colunas em pandas é uma tarefa fácil.
fonte
Supondo que você possa usar expressão regular. Esta solução elimina a necessidade de codificação manual usando regex
fonte