Ändern eines bestimmten Spaltennamens in pandas DataFrame


195

Ich suchte nach einer eleganten Möglichkeit, einen bestimmten Spaltennamen in a zu ändern DataFrame.

Daten abspielen ...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

Die eleganteste Lösung, die ich bisher gefunden habe ...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

Ich hatte auf einen einfachen Einzeiler gehofft ... dieser Versuch schlug fehl ...

df.columns[df.columns.tolist().index('one')] = 'another_name'

Alle Hinweise dankbar erhalten.

Antworten:


355

Es gibt einen Einzeiler:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

Im Folgenden finden Sie die Dokumentzeichenfolge für die renameMethode.

Definition: df.rename (self, index = Keine, Spalten = Keine, copy = True, inplace = False)
Docstring:
Ändern Sie den Index und / oder die Spalten mit der Eingabefunktion oder
Funktionen. Funktions- / Diktatwerte müssen eindeutig sein (1: 1). Etiketten nicht
in einem Diktat / einer Serie enthalten bleiben unverändert.

Parameter
----------
Index: diktartig oder Funktion, optional
    Transformation für Indexwerte
Spalten: diktatartig oder funktional, optional
    Transformation für Spaltenwerte
copy: boolean, default True
    Kopieren Sie auch die zugrunde liegenden Daten
inplace: boolean, Standardwert False
    Gibt an, ob ein neuer DataFrame zurückgegeben werden soll. Wenn True, ist der Wert der Kopie
    ignoriert.

Siehe auch
--------
Serienname

Kehrt zurück
-------
umbenannt: DataFrame (neues Objekt)

Dies funktioniert bei mir nur, wenn ich inplace = True verwende, wie in der Antwort von @ Jeong-Yoon Lee gezeigt.
JStrahl

108

Da ein inplaceArgument verfügbar ist, müssen Sie den ursprünglichen Datenrahmen nicht kopieren und sich selbst zuweisen, sondern gehen wie folgt vor:

df.rename(columns={'two':'new_name'}, inplace=True)

39

Wie wäre es mit?

df.columns.values[2] = "new_name"

11
Eigentlich funktioniert das nicht, wenn Sie später den Spaltennamen für andere Operationen wie in df ['new_name']
Master Yogurt

4
Diese Antwort war nützlich für mich, um eine bestimmte Spalte in einen neuen Namen zu ändern. Die erste Spalte ist Index 0, die zweite Spalte ist Index 1 und so weiter. nette Lösung .. und ich bin sicher, dass dies mehr Menschen helfen wird .. da die anderen Lösungen erfordern, dass Sie die ursprünglichen Spaltennamen im Voraus kennen und kopieren .... während dies eine schnelle und schmutzige Methode ist .. die ihre eigenen Verwendungen hat.
ihightower

1
@MasterYogurt dein Kommentar ist nicht korrekt. Es ist möglich, df['new_name'](und andere Pandas-Dinge) durchzuführen, nachdem Variablen wie oben beschrieben geändert wurden. Ihr Kommentar war möglicherweise gültig, als er ursprünglich veröffentlicht wurde.
Jacob H

1
Trotzdem ist die Verwendung der renameMethoden eine bessere Lösung.
Jacob H

6

Pandas 0.21 hat jetzt einen Achsenparameter

Die Umbenennungsmethode hat einen Achsenparameter erhalten, der mit den meisten anderen Pandas-APIs übereinstimmt.

Also zusätzlich dazu:

df.rename(columns = {'two':'new_name'})

Du kannst tun:

df.rename({'two':'new_name'}, axis=1)

oder

df.rename({'two':'new_name'}, axis='columns')

df.rename ({'two': 'new_name'}, axis = 'column') Löst TypeError aus: Es kann nicht sowohl 'axis' als auch 'index' oder 'column' angegeben werden.
HereHere

@HereHere Stellen Sie sicher, dass Sie auf Pandas Version 0.21 sind. Haben pd.__version__Sie eine neuere Version zu überprüfen
Ted Petrou

5

Wenn Sie wissen, um welche Spalte es sich handelt (erste / zweite / n-te), funktioniert diese Lösung, die auf einer ähnlichen Frage veröffentlicht wurde, unabhängig davon, ob sie benannt oder nicht benannt ist, und zwar in einer Zeile: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)

3

Das Umbenennen der Spalten ist hier einfach und funktioniert sowohl für Default(0,1,2,etc;)als auch für vorhandene Spalten, ist jedoch für größere Datensätze (mit vielen Spalten) nicht sehr nützlich.

Für einen größeren Datensatz können wir die benötigten Spalten in Scheiben schneiden und den folgenden Code anwenden:

df.columns = ['new_name','new_name1','old_name']

2

Der folgende Funktionscode kann helfen:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

Leerzeichen aus Spalten entfernen.


Ich bekam immer wieder, AttributeError: 'int' object has no attribute 'replace'könnten Sie das erweitern.
Nirmal

2

Pandas Version 0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

Für die Aufzeichnung:

Das Weglassen von index = str führt zu einem Fehler. Ersetzen hat ein unerwartetes Argument 'Spalten'.


1

Eine andere Möglichkeit wäre, die Spalte einfach zu kopieren und zu löschen :

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

Danach erhalten Sie das Ergebnis:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5

2
Diese Methode hilft nicht, wenn die Reihenfolge der Spaltenindizes wichtig ist. Die neue Spalte wird am Ende erstellt.
Loochie
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.