Ich habe einen DataFrame mit Pandas und Spaltenbeschriftungen, die ich bearbeiten muss, um die ursprünglichen Spaltenbeschriftungen zu ersetzen.
Ich möchte die Spaltennamen in einem DataFrame ändern, A
wobei die ursprünglichen Spaltennamen lauten:
['$a', '$b', '$c', '$d', '$e']
zu
['a', 'b', 'c', 'd', 'e'].
Ich habe die bearbeiteten Spaltennamen in einer Liste gespeichert, weiß aber nicht, wie ich die Spaltennamen ersetzen soll.
Antworten:
Weisen Sie es einfach dem
.columns
Attribut zu:quelle
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.rename(columns = {'$b':'B'}, inplace = True)
SPEZIFISCHE SPALTEN UMBENENNEN
Verwenden Sie die
df.rename()
Funktion und verweisen Sie auf die umzubenennenden Spalten. Nicht alle Spalten müssen umbenannt werden:Minimales Codebeispiel
Die folgenden Methoden funktionieren alle und erzeugen dieselbe Ausgabe:
Denken Sie daran, das Ergebnis zurück zuzuweisen, da die Änderung nicht vorhanden ist. Alternativ geben Sie Folgendes an
inplace=True
:Ab Version 0.25 können Sie auch angeben
errors='raise'
, dass Fehler ausgelöst werden sollen, wenn eine ungültige Spalte zum Umbenennen angegeben wird. Siehe v0.25-rename()
Dokumente .SPALTENKOPF neu zuordnen
Verwenden Sie
df.set_axis()
mitaxis=1
undinplace=False
(um eine Kopie zurückzugeben).Dies gibt eine Kopie zurück, aber Sie können den DataFrame direkt durch Festlegen ändern
inplace=True
(dies ist das Standardverhalten für Versionen <= 0,24, wird sich aber wahrscheinlich in Zukunft ändern).Sie können Header auch direkt zuweisen:
quelle
code
<class 'pandas.core.frame.DataFrame> Int64Index: 1000 Einträge, 0 bis 999 Datenspalten: BodyMarkdown 1000 Nicht-Null -code
Werke , aber wenn ich dataframe.head () mache, erscheinen die alten Namen für die Spalten wieder.SettingWithCopyWarning:
wenn ich das zweite Code-Snippet in dieser Antwort verwende.df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
Ändert den angezeigten Namen, jedoch nicht die Elemente in der zugrunde liegenden Datenstruktur. Wenn Sie es also versuchendf['newName1']
, wird eine Fehlermeldung angezeigt. Dasinplace=True
ist notwendig, um diese Gotchya zu vermeiden.Die
rename
Methode kann eine Funktion annehmen , zum Beispiel:quelle
df.rename(columns=lambda x: x.lstrip(), inplace=True)
t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)
ist ein Juwel, damit wir schreiben können,df.Column_1_Name
anstatt zu schreibendf.loc[:, 'Column 1 Name']
.Wie in Arbeiten mit Textdaten dokumentiert :
quelle
Pandas 0.21+ Antwort
In Version 0.21 wurden einige wichtige Aktualisierungen für das Umbenennen von Spalten vorgenommen.
rename
Methode hat denaxis
Parameter hinzugefügt, der aufcolumns
oder gesetzt werden kann1
. Durch dieses Update stimmt diese Methode mit dem Rest der Pandas-API überein. Es hat immer noch die Parameterindex
undcolumns
, aber Sie sind nicht mehr gezwungen, sie zu verwenden.set_axis
Methode mit derinplace
Einstellung aufFalse
können Sie alle Index- oder Spaltenbezeichnungen mit einer Liste umbenennen.Beispiele für Pandas 0.21+
Erstellen Sie einen Beispiel-DataFrame:
Verwenden
rename
mitaxis='columns'
oderaxis=1
oder
Beides führt zu Folgendem:
Es ist weiterhin möglich, die alte Methodensignatur zu verwenden:
Die
rename
Funktion akzeptiert auch Funktionen, die auf jeden Spaltennamen angewendet werden.oder
Verwenden
set_axis
mit einer Liste undinplace=False
Sie können der
set_axis
Methode eine Liste bereitstellen, deren Länge der Anzahl der Spalten (oder des Index) entspricht. Derzeitinplace
standardmäßigTrue
, sonderninplace
wird vorbelegt werdenFalse
Meldungen in der Zukunft.oder
Warum nicht verwenden
df.columns = ['a', 'b', 'c', 'd', 'e']
?Es ist nichts Falsches daran, Spalten direkt so zuzuweisen. Es ist eine vollkommen gute Lösung.
Der Vorteil der Verwendung
set_axis
besteht darin, dass sie als Teil einer Methodenkette verwendet werden kann und eine neue Kopie des DataFrame zurückgibt. Ohne sie müssten Sie Ihre Zwischenschritte der Kette in einer anderen Variablen speichern, bevor Sie die Spalten neu zuweisen.quelle
Pandas 0.21+ answer
- irgendwie habe ich diesen Teil im "Was ist neu" Teil verpasst ...(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
Da Sie nur das $ -Zeichen in allen Spaltennamen entfernen möchten, können Sie Folgendes tun:
ODER
quelle
Die vorhandenen Namen werden in der von Ihnen angegebenen Reihenfolge durch die von Ihnen angegebenen Namen ersetzt.
quelle
df.columns.values
, das ist falsch. stackoverflow.com/questions/43291781/…Auf diese Weise können Sie das manuell bearbeiten,
new_names
wie Sie möchten. Funktioniert hervorragend, wenn Sie nur wenige Spalten umbenennen müssen, um Rechtschreibfehler, Akzente, Sonderzeichen usw. zu korrigieren.quelle
df.columns = ['a', 'b', 'c', 'd', 'e']
ist einfacher.df.columns.values
, um die alten Namen zu bekommen.myList = list(df) myList[10:20]
usw. - das ist also perfekt.namez = df.columns.values
gefolgt von einigen Änderungendf.columns = namez
.Einzeilige oder Pipeline-Lösungen
Ich werde mich auf zwei Dinge konzentrieren:
OP stellt klar fest
Ich möchte nicht das Problem lösen, wie
'$'
das erste Zeichen aus jeder Spaltenüberschrift ersetzt oder entfernt werden kann. OP hat diesen Schritt bereits ausgeführt. Stattdessen möchte ich mich darauf konzentrieren, das vorhandenecolumns
Objekt durch ein neues zu ersetzen, wenn eine Liste mit Ersatzspaltennamen vorhanden ist.df.columns = new
Wonew
ist die Liste der neuen Spaltennamen ist so einfach wie es nur geht. Der Nachteil dieses Ansatzes besteht darin, dass dascolumns
Attribut des vorhandenen Datenrahmens bearbeitet werden muss und nicht inline ausgeführt wird. Ich werde einige Möglichkeiten zeigen, wie dies per Pipelining durchgeführt werden kann, ohne den vorhandenen Datenrahmen zu bearbeiten.Setup 1
Um sich auf die Notwendigkeit zu konzentrieren, Spaltennamen durch eine bereits vorhandene Liste zu ersetzen, erstelle ich einen neuen Beispieldatenrahmen
df
mit anfänglichen Spaltennamen und nicht verwandten neuen Spaltennamen.Lösung 1
pd.DataFrame.rename
Es ist gesagt worden , dass bereits , wenn Sie ein Wörterbuch - Mapping der alten Spaltennamen an den neuen Spaltennamen haben, konnte man verwenden
pd.DataFrame.rename
.Sie können dieses Wörterbuch jedoch einfach erstellen und in den Aufruf von aufnehmen
rename
. Im Folgenden wird die Tatsache ausgenutzt, dass beim Iterierendf
jeder Spaltenname durchlaufen wird.Dies funktioniert hervorragend, wenn Ihre ursprünglichen Spaltennamen eindeutig sind. Wenn dies nicht der Fall ist, bricht dies zusammen.
Richten Sie 2
nicht eindeutige Spalten ein
Lösung 2
pd.concat
mit demkeys
ArgumentBeachten Sie zunächst, was passiert, wenn wir versuchen, Lösung 1 zu verwenden:
Wir haben die
new
Liste nicht als Spaltennamen zugeordnet. Wir haben uns wiederholty765
. Stattdessen können wir daskeys
Argument derpd.concat
Funktion verwenden, während wir durch die Spalten von iterierendf
.Lösung 3
Rekonstruieren. Dies sollte nur verwendet werden, wenn Sie
dtype
für alle Spalten eine einzige haben . Andernfalls erhalten Siedtype
object
alle Spalten, und das Zurückkonvertieren erfordert mehr Wörterbucharbeit.Single
dtype
Gemischt
dtype
Lösung 4
Dies ist ein kniffliger Trick mit
transpose
undset_index
.pd.DataFrame.set_index
ermöglicht es uns, einen Index inline zu setzen, aber es gibt keine entsprechendenset_columns
. Wir können also transponierenset_index
und zurück transponieren. Allerdings ist die gleiche Single imdtype
Vergleich zu gemischtemdtype
gilt Vorbehalt aus der Lösung 3 hier.Single
dtype
Gemischt
dtype
Lösung 5
Verwenden Sie ein
lambda
Inpd.DataFrame.rename
, das jedes Element von durchläuft.new
In dieser Lösung übergeben wir ein Lambda, das es nimmt
x
, es dann aber ignoriert. Es dauert auch einy
, aber erwartet es nicht. Stattdessen wird ein Iterator als Standardwert angegeben, und ich kann diesen dann verwenden, um einen nach dem anderen zu durchlaufen, ohne Rücksicht auf den Wert vonx
.Und wie mir die Leute im Sopython- Chat gesagt haben , kann ich meine Variable schützen , wenn ich
*
dazwischen einx
und hinzufüge . In diesem Zusammenhang glaube ich jedoch nicht, dass es geschützt werden muss. Es ist immer noch erwähnenswert.y
y
quelle
df.rename(lambda x : x.lstrip('$'),axis=1)
x
es ignoriert wird?Spaltennamen vs Seriennamen
Ich möchte ein wenig erklären, was hinter den Kulissen passiert.
Datenrahmen sind eine Reihe von Serien.
Serien wiederum sind eine Erweiterung von a
numpy.array
numpy.array
s haben eine Eigenschaft.name
Dies ist der Name der Serie. Es ist selten, dass Pandas dieses Attribut respektieren, aber es verweilt an einigen Stellen und kann verwendet werden, um einige Pandas-Verhaltensweisen zu hacken.
Benennen der Spaltenliste
Viele Antworten sprechen hier davon, dass das
df.columns
Attribut ein ist,list
obwohl es tatsächlich ein istSeries
. Dies bedeutet, dass es ein.name
Attribut hat.Dies passiert, wenn Sie den Namen der Spalten eingeben
Series
:Beachten Sie, dass der Name des Index immer eine Spalte tiefer steht.
Verweilende Artefakte
Das
.name
Attribut bleibt manchmal bestehen. Wenn Siedf.columns = ['one', 'two']
danndf.one.name
einstellen, wird das sein'one'
.Wenn Sie
df.one.name = 'three'
dann setzen,df.columns
wird Ihnen immer noch geben['one', 'two']
, unddf.one.name
wird Ihnen geben'three'
ABER
pd.DataFrame(df.one)
wird zurückkehrenWeil Pandas
.name
das bereits Definierte wiederverwendenSeries
.Mehrstufige Spaltennamen
Pandas hat Möglichkeiten, mehrschichtige Spaltennamen zu erstellen. Es geht nicht so sehr um Magie, aber ich wollte dies auch in meiner Antwort behandeln, da ich hier niemanden sehe, der dies aufgreift.
Dies ist leicht zu erreichen, indem Spalten wie folgt auf Listen gesetzt werden:
quelle
Wenn Sie den Datenrahmen haben, speichert df.columns alles in einer Liste, die Sie bearbeiten und dann als Namen von Spalten in Ihrem Datenrahmen neu zuweisen können ...
Bester Weg? IDK. Ein Weg - ja.
Eine bessere Methode zur Bewertung aller Haupttechniken, die in den Antworten auf die Frage aufgeführt sind, ist die Verwendung von cProfile zur Messung des Speichers und der Ausführungszeit. @kadee, @kaitlyn & @eumiro hatten die Funktionen mit den schnellsten Ausführungszeiten - obwohl diese Funktionen so schnell sind, vergleichen wir die Rundung von .000 und .001 Sekunden für alle Antworten. Moral: Meine Antwort oben ist wahrscheinlich nicht der beste Weg.
quelle
Angenommen, dies ist Ihr Datenrahmen.
Sie können die Spalten mit zwei Methoden umbenennen.
Verwenden von
dataframe.columns=[#list]
Die Einschränkung dieser Methode besteht darin, dass, wenn eine Spalte geändert werden muss, die vollständige Spaltenliste übergeben werden muss. Diese Methode ist auch nicht auf Indexbezeichnungen anwendbar. Zum Beispiel, wenn Sie dies bestanden haben:
Dies wird einen Fehler auslösen. Längenfehlanpassung: Die erwartete Achse hat 5 Elemente, neue Werte haben 4 Elemente.
Eine andere Methode ist die Pandas-
rename()
Methode, mit der ein Index, eine Spalte oder eine Zeile umbenannt wirdEbenso können Sie beliebige Zeilen oder Spalten ändern.
quelle
Wenn Ihre neue Spaltenliste in derselben Reihenfolge wie die vorhandenen Spalten vorliegt, ist die Zuordnung einfach:
Wenn Sie ein Wörterbuch haben, das alte Spaltennamen mit neuen Spaltennamen verknüpft, können Sie Folgendes tun:
Wenn Sie keine Listen- oder Wörterbuchzuordnung haben, können Sie das führende
$
Symbol über ein Listenverständnis entfernen:quelle
lambda col: d[col]
Ihnen könnte passierend.get
... so würde es aussehendf.columns.map(d.get)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
quelle
Lassen Sie uns das Umbenennen anhand eines kleinen Beispiels verstehen ...
1. Spalten mit Mapping umbenennen:
2. Index / Zeilenname mit Zuordnung umbenennen:
quelle
Eine andere Möglichkeit, die ursprünglichen Spaltenbeschriftungen zu ersetzen, besteht darin, die unerwünschten Zeichen (hier '$') von den ursprünglichen Spaltenbeschriftungen zu entfernen.
Dies könnte durch Ausführen einer for-Schleife über df.columns und Anhängen der entfernten Spalten an df.columns geschehen sein.
Stattdessen können wir dies ordentlich in einer einzigen Anweisung tun, indem wir das Listenverständnis wie folgt verwenden:
(Die
strip
Methode in Python entfernt das angegebene Zeichen vom Anfang und Ende der Zeichenfolge.)quelle
Ganz einfach nur benutzen
und es wird die Spaltennamen in der Reihenfolge zuweisen, in der Sie sie setzen
quelle
Sie könnten dafür verwenden
str.slice
:quelle
df.columns.str[1:]
... wahrscheinlich besser zu verwenden, es ist kürzer und offensichtlicher.Ich weiß, dass diese Frage und Antwort zu Tode gekaut wurde. Aber ich bezog mich darauf, um mich für eines der Probleme zu inspirieren, die ich hatte. Ich war in der Lage, es mit Teilen aus verschiedenen Antworten zu lösen und so meine Antwort zu geben, falls jemand es braucht.
Meine Methode ist generisch, wobei Sie zusätzliche Trennzeichen durch Kommatrennung hinzufügen können
delimiters=
Variable und zukunftssicher machen.Arbeitscode:
Ausgabe:
quelle
Beachten Sie, dass dieser Ansatz für einen MultiIndex nicht funktioniert. Für einen MultiIndex müssen Sie Folgendes tun:
quelle
Eine andere Möglichkeit besteht darin, mit einem regulären Ausdruck umzubenennen:
quelle
Wenn Sie mit einer Vielzahl von Spalten umgehen müssen, die vom bereitstellenden System außerhalb Ihrer Kontrolle benannt wurden, habe ich den folgenden Ansatz entwickelt, der eine Kombination aus einem allgemeinen Ansatz und spezifischen Ersetzungen auf einmal darstellt.
Erstellen Sie zunächst ein Wörterbuch aus den Spaltennamen der Datenrahmen mithilfe von Regex-Ausdrücken, um bestimmte Anhänge mit Spaltennamen zu entfernen, und fügen Sie dann dem Wörterbuch bestimmte Ersetzungen hinzu, um die Kernspalten wie später in der empfangenden Datenbank zu benennen.
Dies wird dann auf einmal auf den Datenrahmen angewendet.
quelle
Zusätzlich zu der bereits bereitgestellten Lösung können Sie alle Spalten ersetzen, während Sie die Datei lesen. Wir können
names
und verwendenheader=0
tun.Zuerst erstellen wir eine Liste der Namen, die wir als Spaltennamen verwenden möchten:
In diesem Fall werden alle Spaltennamen durch die Namen ersetzt, die Sie in Ihrer Liste haben.
quelle
Hier ist eine nette kleine Funktion, mit der ich gerne tippe:
Hier ist ein Beispiel, wie es funktioniert:
quelle
Das Umbenennen von Spalten in Pandas ist eine einfache Aufgabe.
quelle
Angenommen, Sie können reguläre Ausdrücke verwenden. Diese Lösung macht die manuelle Codierung mit Regex überflüssig
quelle