Alterando um nome de coluna específico no DataFrame do pandas

195

Eu estava procurando uma maneira elegante de alterar um nome de coluna especificado em a DataFrame.

reproduzir dados ...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

A solução mais elegante que encontrei até agora ...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

Eu estava esperando por uma linha simples ... essa tentativa falhou ...

df.columns[df.columns.tolist().index('one')] = 'another_name'

Quaisquer dicas recebidas com gratidão.

Marcar gráfico
fonte

Respostas:

355

Um liner existe:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

A seguir, a documentação do renamemétodo.

Definição: df.rename (próprio, índice = Nenhum, colunas = Nenhum, cópia = Verdadeiro, local = Falso)
Docstring:
Altere o índice e / ou colunas usando a função de entrada ou
funções. Os valores de função / ditado devem ser exclusivos (1 para 1). Etiquetas não
contido em um ditado / série será deixado como está.

Parâmetros
----------
índice: dict-like ou função, opcional
    Transformação a ser aplicada aos valores de índice
colunas: tipo ditado ou função, opcional
    Transformação a ser aplicada aos valores da coluna
cópia: booleano, padrão True
    Copie também os dados subjacentes
inplace: boolean, padrão False
    Se deve retornar um novo DataFrame. Se True, o valor da cópia é
    ignorado.

Veja também
--------
Series.rename

Devoluções
-------
renomeado: DataFrame (novo objeto)
Nipun Batra
fonte
Isso não funciona para mim, a menos que eu use o inplace = True, como mostra a resposta @ Jeong-Yoon Lee.
JStrahl 19/03
108

Como o inplaceargumento está disponível, você não precisa copiar e atribuir o quadro de dados original a si próprio, mas faça o seguinte:

df.rename(columns={'two':'new_name'}, inplace=True)
Jeong-Yoon Lee
fonte
39

A respeito?

df.columns.values[2] = "new_name"
Jacob H
fonte
11
na verdade, que não funciona Se mais tarde você usar o nome da coluna em outras operações como em df [ 'new_name']
Mestre Yogurt
4
essa resposta foi útil para alterar uma coluna específica para um novo nome. A primeira coluna é o índice 0, a segunda coluna é o índice 1 e assim por diante. solução agradável .. e tenho certeza de que isso ajudará mais pessoas .. pois as outras soluções exigem que você saiba e copie os nomes das colunas originais de antemão ... enquanto esse é um método rápido e sujo .. que tem seus próprios usos.
Ihightower 30/09/19
1
@MasterYogurt seu comentário não está correto. É possível executar df['new_name'](e outras coisas de pandas) após alterar as variáveis, conforme descrito acima. Seu comentário pode ter sido válido quando foi publicado originalmente.
27918 Jacob H
1
Dito isto, usar os renamemétodos é uma solução melhor.
27918 Jacob H
6

O Pandas 0.21 agora tem um parâmetro de eixo

O método de renomeação ganhou um parâmetro de eixo para corresponder à maioria do restante da API do pandas.

Então, além disso:

df.rename(columns = {'two':'new_name'})

Você pode fazer:

df.rename({'two':'new_name'}, axis=1)

ou

df.rename({'two':'new_name'}, axis='columns')
Ted Petrou
fonte
df.rename ({'two': 'new_name'}, axis = 'columns') Lança TypeError: Não é possível especificar 'axis' e qualquer um dos 'index' ou 'column'.
HereHere
@HereHere Certifique-se de estar na versão 0.21 do pandas. O que fazer pd.__version__para verificar sua versão
Ted Petrou
5

Se você souber qual coluna # é (primeiro / segundo / enésimo), essa solução postada em uma pergunta semelhante funcionará independentemente de ser nomeada ou não, e em uma linha: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)
Nikhil VJ
fonte
3

Para renomear as colunas, aqui está a simples que funcionará para Default(0,1,2,etc;)as colunas existente e existente, mas não muito útil para conjuntos de dados maiores (com muitas colunas).

Para um conjunto de dados maior, podemos dividir as colunas necessárias e aplicar o código abaixo:

df.columns = ['new_name','new_name1','old_name']
Naveen Reddy
fonte
2

O código curto a seguir pode ajudar:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

Remova espaços das colunas.

Emmanuel Masabo
fonte
Eu continuei conseguindo AttributeError: 'int' object has no attribute 'replace'você expandir isso.
Nirmal
2

pandas versão 0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

Para o registro:

omitir index = str dará erro substituir tem um argumento inesperado 'colunas'

Kallol Medhi
fonte
1

Outra opção seria simplesmente copiar e soltar a coluna:

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

Depois disso, você obtém o resultado:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5
anka
fonte
2
Este método não ajudará caso a ordem dos índices das colunas seja importante. A nova coluna será criada no final.
Loochie 9/01/19