Como adicionar um sufixo (ou prefixo) a cada nome de coluna?

88

Quero adicionar _xsufixo a cada nome de coluna assim:

featuresA = myPandasDataFrame.columns.values + '_x'

Como eu faço isso? Além disso, se eu quisesse adicionar x_como sufixo, como a solução mudaria?

Klausos Klausos
fonte

Respostas:

120

Você pode usar uma listcompreensão:

df.columns = [str(col) + '_x' for col in df.columns]

Existem também métodos integrados como .add_suffix()e .add_prefix()conforme mencionado em outra resposta.

Stefan
fonte
esta é a resposta mais simplista e elegante!
Jinhua Wang
163

A seguir está a melhor maneira de adicionar sufixo na minha opinião.

df = df.add_suffix('_some_suffix')

Por ser uma função que é chamada no DataFrame e retorna o DataFrame - você pode usá-la na cadeia das chamadas.

Jarosław Szymczak
fonte
14
Você pode usar add_prefix se quiser adicionar um prefixo aos nomes.
Jorge
9
Pena que isso não pode ser mutável (ou seja, não tem uma inplace=Trueopção de parâmetro). Caso contrário, perfeito.
ijoseph
Acho que isso é melhor do que a resposta aceita em algumas circunstâncias, porque pode ser usado em uma cadeia de operações em uma única instrução, em vez de precisar de sua própria instrução.
Capitão Lepton
@CaptainLepton quando esta resposta não seria melhor do que a aceita
baxx
1
Se o sufixo não for uma constante. O título fala sobre sufixos. A postagem restringe o escopo a um único sufixo constante, mas se estivermos respondendo ao título da postagem em termos gerais, definir as colunas por meio de uma lista de compreensão ou outro iterável é mais flexível
Capitão Lepton
17

Concatenação elegante no local

Se você está tentando modificar dfno local, a opção mais barata (e mais simples) é a adição no local diretamente no df.columns(ou seja, usando Index.__iadd__).

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Para adicionar um prefixo, você usaria da mesma forma

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Outra opção barata é usar uma compreensão de lista com f-stringformatação (disponível em python3.6 +).

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

E para prefixo, da mesma forma,

df.columns = [f'some_prefix{c}' for c in df]

Encadeamento de Método

Também é possível adicionar * correções durante o encadeamento de métodos. Para adicionar um sufixo, useDataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Isso retorna uma cópia dos dados. IOW, dfnão é modificado.

Adicionar prefixos também é feito com DataFrame.add_prefix.

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Que também não se modifica df.


Crítica de add_*fix

Estes são bons métodos se você estiver tentando executar o encadeamento de métodos:

df.some_method1().some_method2().add_*fix(...)

No entanto, add_prefix(e add_suffix) cria uma cópia de todo o dataframe, apenas para modificar os cabeçalhos. Se você acredita que isso é um desperdício, mas ainda quer fazer uma corrente, você pode ligar para pipe:

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)
cs95
fonte
Isso é elegante! E se você quiser adicionar um prefixo ou sufixo a um subconjunto de colunas, por exemplo, as colunas cujos nomes contêm uma palavra comum (como newou old) em vez de todas as colunas? Obrigado.
Bowen Liu
1
@BowenLiu Eu sugeriria usar df.rename () ao invés ... Passe um dicionário de mapeamento de nomes para seus novos nomes. Em seguida, chame renomear com eixo = 1. Você também pode usar a atribuição de compreensão de lista condicional.
cs95
Funciona apenas com tipos de dados regulares como nomes de coluna, não se suas colunas forem um RangeIndex como por exemplo df = pd.DataFrame([[1,2,3]]*10)-> df.columns, então você usariadf.add_suffix('_x')
Lorenz
você pode fazer df.columns = df.columns.astype(str) + '_x' como meu primeiro método mostra.
cs95
4

Eu não vi essa solução proposta acima, então adicionei isso à lista:

df.columns += '_x'

E você pode se adaptar facilmente ao cenário de prefixo.

JPA
fonte
A melhor solução para o sufixo, embora não possa ser usado como prefixo, é claro.
Lorenz
Funciona apenas com tipos de dados regulares nos nomes das colunas, não se suas colunas forem um RangeIndex como por exemplo df = pd.DataFrame([[1,2,3]]*10)-> df.columns, então você usariadf.add_suffix('_x')
Lorenz
1

Eu conheço 4 maneiras de adicionar um sufixo (ou prefixo) aos nomes de suas colunas:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

ou

2- df.rename(columns= lambda col: col+'_some_suffix')

ou

3- df.columns += '_some_suffix'muito mais fácil.

ou, o mais legal:

3- df.add_suffix('_some_suffix')

Mahmoud Reda
fonte
0

Usando DataFrame.rename.

Suspensão de uso add_prefixeadd_suffix

Em versões futuras do pandas add_prefixe add_suffixserá preterido . O novo método recomendado é usar DataFrame.rename:

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

Usando renamecom axis=1e formatação de string:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

Para realmente sobrescrever os nomes das colunas, podemos atribuir os valores retornados ao nosso df:

df = df.rename('col_{}'.format, axis=1)

ou use inplace=True:

df.rename('col_{}'.format, axis=1, inplace=True)
Erfan
fonte