Comment ajouter un suffixe (ou préfixe) à chaque nom de colonne?

88

Je veux ajouter un _xsuffixe à chaque nom de colonne comme ceci:

featuresA = myPandasDataFrame.columns.values + '_x'

Comment puis-je faire cela? De plus, si je voulais ajouter x_comme suffixe, comment la solution changerait-elle?

Klausos Klausos
la source

Réponses:

121

Vous pouvez utiliser une listcompréhension:

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

Il existe également des méthodes intégrées comme .add_suffix()et .add_prefix()comme mentionné dans une autre réponse.

Stefan
la source
c'est la réponse la plus simpliste et la plus élégante!
Jinhua Wang
163

Ce qui suit est la meilleure façon d'ajouter un suffixe à mon avis.

df = df.add_suffix('_some_suffix')

Comme il s'agit d'une fonction appelée sur DataFrame et qui renvoie DataFrame - vous pouvez l'utiliser dans la chaîne des appels.

Jarosław Szymczak
la source
14
Vous pouvez utiliser add_prefix si vous souhaitez ajouter un préfixe aux noms.
Jorge
9
Dommage que cela ne puisse pas être mutable (c'est-à-dire qu'il n'a pas d' inplace=Trueoption de paramètre). Sinon, parfait.
ijoseph
Je pense que c'est mieux que la réponse acceptée dans certaines circonstances, car elle peut être utilisée dans une chaîne d'opérations dans une seule déclaration, plutôt que d'avoir besoin de sa propre déclaration.
Captain Lepton
@CaptainLepton quand cette réponse ne serait-elle pas meilleure que la réponse acceptée
baxx
1
Si le suffixe n'est pas une constante. Le titre parle de suffixes. Le message réduit la portée à un seul suffixe constant, mais si nous répondons au titre du message en termes généraux, définir les colonnes via une compréhension de liste ou un autre itérable est plus flexible
Captain Lepton
17

Concaténation sur place élégante

Si vous essayez de modifier dfsur place, l'option la moins chère (et la plus simple) est l'ajout sur place directement sur df.columns(c'est-à-dire en utilisant 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

Pour ajouter un préfixe, vous utiliseriez de la même manière

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

Une autre option bon marché consiste à utiliser une compréhension de liste avec f-stringmise en forme (disponible sur 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

Et pour le préfixe, de même,

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

Chaînage de méthodes

Il est également possible d'ajouter des correctifs lors du chaînage des méthodes. Pour ajouter un suffixe, utilisezDataFrame.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

Cela renvoie une copie des données. IOW, dfn'est pas modifié.

L'ajout de préfixes se fait également avec 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

Qui ne modifie pas non plus df .


Critique de add_*fix

Ce sont de bonnes méthodes si vous essayez d'effectuer un chaînage de méthodes:

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

Cependant, add_prefix(et add_suffix) crée une copie de l' ensemble du dataframe, juste pour modifier les en-têtes. Si vous pensez que c'est du gaspillage, mais que vous souhaitez quand même enchaîner, vous pouvez appeler pipe:

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

df.some_method1().some_method2().pipe(add_suffix)
cs95
la source
C'est élégant! Que faire si vous souhaitez ajouter un préfixe ou un suffixe à un sous-ensemble de colonnes, par exemple les colonnes dont les noms contiennent tous un mot commun (comme newou old) au lieu de toutes les colonnes? Merci.
Bowen Liu
1
@BowenLiu Je suggérerais plutôt d'utiliser df.rename () ... Passez un dictionnaire mappant les noms à leurs nouveaux noms. Appelez ensuite renommer avec axis = 1. Vous pouvez également utiliser une affectation de compréhension de liste conditionnelle.
cs95
Fonctionne uniquement avec des types de données normaux comme noms de colonnes, pas si vos colonnes sont un RangeIndex comme par exemple df = pd.DataFrame([[1,2,3]]*10)-> df.columns, alors vous utiliseriezdf.add_suffix('_x')
Lorenz
vous pouvez faire df.columns = df.columns.astype(str) + '_x' comme le montre ma première méthode.
cs95 le
4

Je n'ai pas vu cette solution proposée ci-dessus, alors ajoutez-la à la liste:

df.columns += '_x'

Et vous pouvez facilement vous adapter au scénario de préfixe.

JPA
la source
Meilleure solution pour le suffixe, bien qu'il ne puisse pas être utilisé pour le préfixe bien sûr.
Lorenz
Fonctionne uniquement avec les types de données normaux dans les noms de colonne, pas si vos colonnes sont un RangeIndex comme par exemple df = pd.DataFrame([[1,2,3]]*10)-> df.columns, alors vous utiliseriezdf.add_suffix('_x')
Lorenz
1

Je connais 4 façons d'ajouter un suffixe (ou un préfixe) aux noms de votre colonne:

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'beaucoup plus facile.

ou, le plus beau:

3- df.add_suffix('_some_suffix')

Mahmoud Reda
la source
0

Utilisation DataFrame.rename.

Dépréciation de add_prefixetadd_suffix

Dans les futures versions de pandas add_prefixet add_suffixsera obsolète . La nouvelle méthode conseillée consiste à utiliser 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

Utilisation renamede axis=1la mise en forme avec et chaîne:

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

Pour écraser réellement vos noms de colonnes, nous pouvons affecter les valeurs renvoyées à notre df:

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

ou utilisez inplace=True:

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