Ich habe einen Datenrahmen mit dem Namen Daten
. Wie würde ich die einzige Spaltenüberschrift umbenennen? Zum Beispiel gdp
in 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 Sie konstruieren eine Zuordnung mit Hilfe eines "Dictionary" und führen die "List-Comprehension" mit dessen "Get"-Operation durch, indem Sie den Standardwert als alten Namen festlegen:
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]
Zeitpunkte:
%%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 kann ich eine bestimmte Spalte in Pandas umbenennen?
Ab v0.24+ können Sie eine (oder mehrere) Spalten auf einmal umbenennen,
DataFrame.rename()
mit Achse=1
oder Achse='Spalten'
(das Argument Achse
wurde in v0.21
eingeführt.
Index.str.replace()
für String/Regex-basierte Ersetzung.
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 In-Place-Änderung verfügbar.umbenennen
mit Achse=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
Mit 0.21+ kann man nun einen axis
Parameter mit rename
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
standardmäßig nicht an Ort und Stelle ist, so dass Sie das Ergebnis zurückgeben müssen).
Dieser Zusatz wurde gemacht, um die Konsistenz mit dem Rest der API zu verbessern. Das neue Argument "axis" ist analog zum Parameter "columns" - sie bewirken 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 Callback, der einmal für jede Spalte 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 würden Sie Folgendes verwenden wollen
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Index.str.replace
Ähnlich wie die replace
-Methode für Strings in Python, definieren Pandas Index und Series (nur Objekttyp) eine ("vektorisierte") str.replace
-Methode für String- und Regex-basierte Ersetzungen.
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
Der Vorteil dieser Methode gegenüber den anderen Methoden ist, dass str.replace
Regex unterstützt (standardmäßig aktiviert). Siehe die Dokumentation für weitere Informationen.
set_axis
mit axis=1
Aufruf von set_axis
mit einer Liste von Überschriften. Die Liste muss gleich lang sein wie die Spalten/Indexgröße. set_axis
verändert standardmäßig den ursprünglichen DataFrame, aber Sie können inplace=False
angeben, um eine modifizierte 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 auf True
gesetzt.
Methodenverkettung
Warum set_axis
wählen, wenn wir bereits eine effiziente Möglichkeit haben, Spalten mit df.columns = ...
zuzuweisen? Wie von Ted Petrou in [dieser Antwort] gezeigt, (https://stackoverflow.com/a/46912050/4909087) ist set_axis
nützlich, wenn man versucht, Methoden zu verketten.
Vergleiche
# 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()
Der erste Satz ist natürlicher und fließender in der Syntax.