Ich habe einen Datenrahmen mit dem Namen data
. Wie würde ich die einzige Spaltenüberschrift umbenennen? Zum Beispiel gdp
bis log(gdp)
?
data =
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
Eine viel schnellere Implementierung wäre die Verwendung von list-comprehension
, wenn Sie eine einzelne Spalte umbenennen müssen.
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
Wenn Sie mehrere Spalten umbenennen müssen, verwenden Sie entweder bedingte Ausdrücke wie:
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
Oder konstruieren Sie ein Mapping mit einem dictionary
und führen Sie das list-comprehension
mit seiner get
-Operation, indem der Standardwert als alter Name festgelegt wird:
col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name
df.columns = [col_dict.get(x, x) for x in df.columns]
Timings:
%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop
%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop
Wie benenne ich eine bestimmte Spalte in Pandas um?
Ab Version 0.24 + können Sie eine (oder mehrere) Spalten gleichzeitig umbenennen.
DataFrame.rename()
mit axis=1
oder axis='columns'
(das Argument axis
wurde in v0.21
eingeführt. .
Index.str.replace()
für String/Regex-basiertes Ersetzen.
Wenn Sie ALLE Spalten auf einmal umbenennen müssen,
DataFrame.set_axis()
Methode mit axis=1
. Übergeben Sie eine listenartige Sequenz. Es sind auch Optionen für die direkte Änderung verfügbar.rename
mit axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Ab 0.21 können Sie jetzt mit axis
einen rename
-Parameter angeben:
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
(Beachten Sie, dass rename
nicht standardmäßig vorhanden ist, daher müssen Sie das Ergebnis zurück zuweisen .)
Dieser Zusatz wurde vorgenommen, um die Konsistenz mit dem Rest der API zu verbessern. Das neue Argument axis
entspricht dem Parameter columns
- sie tun dasselbe.
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
rename
akzeptiert auch einen Rückruf, der für jede Spalte einmal aufgerufen wird.
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Für dieses spezielle Szenario möchten Sie verwenden
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Index.str.replace
Ähnlich wie bei der replace
-Methode von Strings in Python definieren pandas Index und Series (nur Objekt-dtype)) eine ("vektorisierte") str.replace
-Methode für String und Regex -basierter Ersatz.
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Dies hat gegenüber den anderen Methoden den Vorteil, dass str.replace
Reguläre Ausdrücke unterstützt (standardmäßig aktiviert). Weitere Informationen finden Sie in den Dokumenten.
set_axis
Mit axis=1
Rufen Sie set_axis
Mit einer Liste der Header auf. Die Liste muss gleich lang sein wie die Spalten-/Indexgröße. set_axis
Mutiert standardmäßig den ursprünglichen DataFrame. Sie können jedoch inplace=False
Angeben, um eine geänderte Kopie zurückzugeben.
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Hinweis: In zukünftigen Versionen wird inplace
standardmäßig True
sein.
Methodenverkettung
Warum set_axis
Wählen, wenn wir bereits eine effiziente Möglichkeit haben, Spalten mit df.columns = ...
Zuzuweisen? Wie Ted Petrou in [dieser Antwort] gezeigt hat, ist ( https://stackoverflow.com/a/46912050/4909087 ) set_axis
Nützlich, wenn Sie versuchen, Methoden zu verketten.
Vergleichen Sie
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
Versus
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
Ersteres ist eine natürlichere und frei fließende Syntax.