Wie füge ich jedem Spaltennamen ein Suffix (oder Präfix) hinzu?

88

Ich möchte _xjedem Spaltennamen das folgende Suffix hinzufügen :

featuresA = myPandasDataFrame.columns.values + '_x'

Wie mache ich das? x_Wie würde sich die Lösung ändern , wenn ich als Suffix hinzufügen wollte ?

Klausos Klausos
quelle

Antworten:

121

Sie können ein listVerständnis verwenden:

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

Es gibt auch integrierte Methoden wie .add_suffix()und .add_prefix()wie in einer anderen Antwort erwähnt.

Stefan
quelle
Dies ist die einfachste und eleganteste Antwort!
Jinhua Wang
163

Das Folgende ist meiner Meinung nach der schönste Weg, ein Suffix hinzuzufügen.

df = df.add_suffix('_some_suffix')

Da es sich um eine Funktion handelt, die in DataFrame aufgerufen wird und DataFrame zurückgibt, können Sie sie in der Kette der Aufrufe verwenden.

Jarosław Szymczak
quelle
14
Sie können add_prefix verwenden, wenn Sie den Namen ein Präfix hinzufügen möchten.
Jorge
9
Schade, dass dies nicht veränderbar sein kann (dh keine inplace=TrueParameteroption hat). Ansonsten perfekt.
Ijoseph
Ich denke, dass dies unter bestimmten Umständen besser ist als die akzeptierte Antwort, da es in einer Kette von Operationen in einer einzelnen Anweisung verwendet werden kann, anstatt eine eigene Anweisung zu benötigen.
Kapitän Lepton
@CaptainLepton wann wäre diese Antwort nicht besser als die akzeptierte Antwort
baxx
1
Wenn das Suffix keine Konstante ist. Der Titel spricht von Suffixen. Der Beitrag beschränkt den Bereich auf ein einzelnes konstantes Suffix. Wenn wir jedoch den Beitragstitel allgemein beantworten, ist das Festlegen der Spalten über ein Listenverständnis oder eine andere iterierbare Funktion flexibler
Captain Lepton,
17

Elegante Verkettung vor Ort

Wenn Sie versuchen, Änderungen dfan Ort und Stelle vorzunehmen, ist die billigste (und einfachste) Option die direkte Hinzufügung direkt an df.columns(dh mit 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

Um ein Präfix hinzuzufügen, würden Sie es ähnlich verwenden

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

Eine weitere kostengünstige Option ist die Verwendung eines Listenverständnisses mit f-stringFormatierung (verfügbar unter 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

Und für das Präfix ähnlich

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

Methodenverkettung

Es ist auch möglich, während der Methodenverkettung * Korrekturen hinzuzufügen. Verwenden Sie, um ein Suffix hinzuzufügenDataFrame.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

Dies gibt eine Kopie der Daten zurück. IOW dfwird nicht geändert.

Das Hinzufügen von Präfixen erfolgt ebenfalls mit 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

Was sich auch nicht ändert df.


Kritik an add_*fix

Dies sind gute Methoden, wenn Sie versuchen, eine Methodenverkettung durchzuführen:

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

Allerdings add_prefix(und add_suffix) erstellt eine Kopie des gesamten Datenrahmen, nur die Header zu ändern. Wenn Sie glauben, dass dies verschwenderisch ist, aber dennoch verketten möchten, können Sie anrufen pipe:

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

df.some_method1().some_method2().pipe(add_suffix)
cs95
quelle
Das ist elegant! Was ist, wenn Sie einer Teilmenge der Spalten ein Präfix oder Suffix hinzufügen möchten, z. B. die Spalten, deren Namen anstelle aller Spalten ein gemeinsames Wort (wie newoder old) enthalten ? Vielen Dank.
Bowen Liu
1
@BowenLiu Ich würde vorschlagen, stattdessen mit df.rename () zu arbeiten ... Übergeben Sie ein Wörterbuch, das Namen ihren neuen Namen zuordnet. Rufen Sie dann die Umbenennung mit Achse = 1 auf. Sie können auch die bedingte Listenverständniszuweisung verwenden.
CS95
Funktioniert nur mit regulären Datentypen als Spaltennamen, nicht wenn Ihre Spalten ein RangeIndex sind, wie zum Beispiel df = pd.DataFrame([[1,2,3]]*10)-> df.columns, dann würden Siedf.add_suffix('_x')
Lorenz
Sie können tun, df.columns = df.columns.astype(str) + '_x' wie meine erste Methode zeigt.
cs95
4

Ich habe diese oben vorgeschlagene Lösung nicht gesehen, also füge sie der Liste hinzu:

df.columns += '_x'

Und Sie können sich leicht an das Präfix-Szenario anpassen.

JPA
quelle
Beste Lösung für das Suffix, obwohl es natürlich nicht als Präfix verwendet werden kann.
Lorenz
Funktioniert nur mit regulären Datentypen in den Spaltennamen, nicht wenn Ihre Spalten ein RangeIndex sind, wie zum Beispiel df = pd.DataFrame([[1,2,3]]*10)-> df.columns, dann würden Siedf.add_suffix('_x')
Lorenz
1

Ich kenne 4 Möglichkeiten, um den Namen Ihrer Spalte ein Suffix (oder Präfix) hinzuzufügen:

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

oder

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

oder

3- df.columns += '_some_suffix'viel einfacher.

oder das schönste:

3- df.add_suffix('_some_suffix')

Mahmoud Reda
quelle
0

Verwenden von DataFrame.rename.

Abschreibung von add_prefixundadd_suffix

In zukünftigen Versionen von Pandas add_prefixund add_suffixwird veraltet sein . Die neue empfohlene Methode lautet 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

Verwenden renamemit axis=1und Zeichenfolgenformatierung:

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

Um Ihre Spaltennamen tatsächlich zu überschreiben, können wir die zurückgegebenen Werte unseren zuweisen df:

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

oder verwenden inplace=True:

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