Benennen Sie den Pandas DataFrame-Index um

141

Ich habe eine CSV-Datei ohne Header mit einem DateTime-Index. Ich möchte den Index und den Spaltennamen umbenennen, aber mit df.rename () wird nur der Spaltenname umbenannt. Fehler? Ich bin auf Version 0.12.0

In [2]: df = pd.read_csv(r'D:\Data\DataTimeSeries_csv//seriesSM.csv', header=None, parse_dates=[[0]], index_col=[0] )

In [3]: df.head()
Out[3]: 
                   1
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

In [4]: df.rename(index={0:'Date'}, columns={1:'SM'}, inplace=True)

In [5]: df.head()
Out[5]: 
                  SM
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667
Mattijn
quelle
5
Wenn Sie 2017 zu dieser Frage kommen, lesen Sie diese Antwort unten , um eine sehr detaillierte Erklärung der rename_axisMethode zu erhalten.
Ted Petrou
3
Und für diejenigen, die sich nicht die Mühe machen können, die gesamte gute Antwort unten zu lesen, ist die schnelle Lösung df.rename_axis("Date", axis='index', inplace=True)gemäß der Dokumentation pandas.pydata.org/pandas-docs/stable/generated/… oderdf.index.names = ['Date']
tommy.carstensen

Antworten:

236

Das renameVerfahren nimmt ein Wörterbuch für den Index, der Index gilt Werte .
Sie möchten den Namen der Indexebene umbenennen:

df.index.names = ['Date']

Eine gute Möglichkeit, darüber nachzudenken, besteht darin, dass Spalten und Index vom selben Objekttyp ( Indexoder MultiIndex) sind und Sie die beiden über die Transponierung austauschen können.

Dies ist etwas verwirrend, da die Indexnamen eine ähnliche Bedeutung wie Spalten haben. Hier einige weitere Beispiele:

In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))

In [2]: df
Out[2]: 
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df1 = df.set_index('A')

In [4]: df1
Out[4]: 
   B  C
A      
1  2  3
4  5  6

Sie können die Umbenennung im Index sehen, wodurch sich der Wert 1 ändern kann :

In [5]: df1.rename(index={1: 'a'})
Out[5]: 
   B  C
A      
a  2  3
4  5  6

In [6]: df1.rename(columns={'B': 'BB'})
Out[6]: 
   BB  C
A       
1   2  3
4   5  6

Beim Umbenennen der Ebenennamen:

In [7]: df1.index.names = ['index']
        df1.columns.names = ['column']

Hinweis: Dieses Attribut ist nur eine Liste, und Sie können das Umbenennen als Listenverständnis / Karte durchführen.

In [8]: df1
Out[8]: 
column  B  C
index       
1       2  3
4       5  6
Andy Hayden
quelle
2
Gute Antwort. Nur eine sanfte Erinnerung daran , dass ohne "inplace =True", df1.renamenicht wirklich etwas ändern würde.
Sarah
63

In der aktuell ausgewählten Antwort wird die rename_axisMethode nicht erwähnt, mit der die Index- und Spaltenebenen umbenannt werden können.


Pandas hat einige Eigenheiten, wenn es darum geht, die Ebenen des Index umzubenennen. Es gibt auch eine neue DataFrame-Methode rename_axiszum Ändern der Namen auf Indexebene .

Schauen wir uns einen DataFrame an

df = pd.DataFrame({'age':[30, 2, 12],
                       'color':['blue', 'green', 'red'],
                       'food':['Steak', 'Lamb', 'Mango'],
                       'height':[165, 70, 120],
                       'score':[4.6, 8.3, 9.0],
                       'state':['NY', 'TX', 'FL']},
                       index = ['Jane', 'Nick', 'Aaron'])

Geben Sie hier die Bildbeschreibung ein

Dieser DataFrame hat eine Ebene für jeden Zeilen- und Spaltenindex. Sowohl der Zeilen- als auch der Spaltenindex haben keinen Namen. Lassen Sie uns den Namen der Zeilenindexebene in 'Namen' ändern.

df.rename_axis('names')

Geben Sie hier die Bildbeschreibung ein

Die rename_axisMethode hat auch die Möglichkeit, die Namen der Spaltenebene durch Ändern des axisParameters zu ändern :

df.rename_axis('names').rename_axis('attributes', axis='columns')

Geben Sie hier die Bildbeschreibung ein

Wenn Sie den Index mit einigen Spalten festlegen, wird der Spaltenname zum neuen Namen auf Indexebene. Fügen wir an die Indexebenen unseres ursprünglichen DataFrame hinzu:

df1 = df.set_index(['state', 'color'], append=True)
df1

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass der ursprüngliche Index keinen Namen hat. Wir können weiterhin rename_axiseine Liste mit der gleichen Länge wie die Anzahl der Indexebenen verwenden , müssen diese jedoch übergeben.

df1.rename_axis(['names', None, 'Colors'])

Geben Sie hier die Bildbeschreibung ein

Sie können Nonedamit die Namen der Indexebenen effektiv löschen.


Serien funktionieren ähnlich, aber mit einigen Unterschieden

Erstellen wir eine Serie mit drei Indexstufen

s = df.set_index(['state', 'color'], append=True)['food']
s

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: food, dtype: object

Wir können rename_axisähnlich wie bei DataFrames verwenden

s.rename_axis(['Names','States','Colors'])

Names  States  Colors
Jane   NY      blue      Steak
Nick   TX      green      Lamb
Aaron  FL      red       Mango
Name: food, dtype: object

Beachten Sie, dass sich unterhalb der aufgerufenen Serie ein zusätzliches Stück Metadaten befindet Name. Beim Erstellen einer Serie aus einem DataFrame wird dieses Attribut auf den Spaltennamen festgelegt.

Wir können der renameMethode einen Zeichenfolgennamen übergeben , um ihn zu ändern

s.rename('FOOOOOD')

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: FOOOOOD, dtype: object

DataFrames haben dieses Attribut nicht und infact löst bei dieser Verwendung eine Ausnahme aus

df.rename('my dataframe')
TypeError: 'str' object is not callable

Vor Pandas 0.21 hätten Sie rename_axisdie Werte im Index und in den Spalten umbenennen können. Es ist veraltet, also tu das nicht

Ted Petrou
quelle
1
Sollten Sie tauschen df1 = df.set_index(['state', 'color'], append=True)mit df1.rename_axis(['names', None, 'Colors'])?
Salhin
Was ist, wenn ich "Nick" in "Nicolas" umbenennen möchte? Das war es, wonach ich gesucht habe, als ich "Pandas Index umbenennen" gegoogelt habe und hier gelandet bin. EDIT: Oh warte, die akzeptierte Antwort erklärt das, es war mir zunächst einfach nicht klar.
Ben Farmer
Schön, dies ist die einzige Antwort, die in verketteten Aufgaben verwendet werden kann!
IanS
19

Für neuere pandasVersionen

df.index = df.index.rename('new name')

oder

df.index.rename('new name', inplace=True)

Letzteres ist erforderlich, wenn ein Datenrahmen alle seine Eigenschaften beibehalten soll.

Serge Stroobandt
quelle
18

In Pandas Version 0.13 und höher sind die Namen der Indexebenen unveränderlich (Typ FrozenList) und können nicht mehr direkt festgelegt werden. Sie müssen zuerst die neuen Indexebenennamen Index.rename()auf den Index DataFrame.reindex()anwenden und dann den neuen Index auf den DataFrame anwenden. Beispiele:

Für Pandas Version <0.13

df.index.names = ['Date']

Für Pandas Version> = 0.13

df = df.reindex(df.index.rename(['Date']))
David Smith
quelle
9
Nicht wahr! In meiner Version von Pandas (0.13.1) funktioniert df.index.names = ['foo'] einwandfrei!
LondonRob
5
Vielen Dank, dass Sie bemerkt haben, dass @LondonRob - `df.index.names = ['foo']` auch mit Pandas 0.14 für mich funktioniert. Anscheinend war das nur kurz kaputt und beim Testen enthalten.
David Smith
1
Das Festlegen von Namen für entweder indexoder columndirekt ändert beide für mich (unter Pandas 0.19), jedoch nicht mit dieser Methode.
FooBar
8

Sie können auch Index.set_namesFolgendes verwenden:

In [25]: x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
   ....:                   'country':['A','A','B','B','A','A','B','B'],
   ....:                   'prod':[1,2,1,2,1,2,1,2],
   ....:                   'val':[10,20,15,25,20,30,25,35]})

In [26]: x = x.set_index(['year','country','prod']).squeeze()

In [27]: x
Out[27]: 
year  country  prod
1     A        1       10
               2       20
      B        1       15
               2       25
2     A        1       20
               2       30
      B        1       25
               2       35
Name: val, dtype: int64
In [28]: x.index = x.index.set_names('foo', level=1)

In [29]: x
Out[29]: 
year  foo  prod
1     A    1       10
           2       20
      B    1       15
           2       25
2     A    1       20
           2       30
      B    1       25
           2       35
Name: val, dtype: int64
LondonRob
quelle
2
Kann das für einen funktionieren multiIndex? MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F'], ['Y', 'Z']], labels=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], names=['Portfolio', None])Ist es möglich , die umbenennen Nonezu measures?
Strg-Alt-Löschen
2

Wenn Sie dieselbe Zuordnung zum Umbenennen von Spalten und Index verwenden möchten, haben Sie folgende Möglichkeiten:

mapping = {0:'Date', 1:'SM'}
df.index.names = list(map(lambda name: mapping.get(name, name), df.index.names))
df.rename(columns=mapping, inplace=True)
danio
quelle
0
df.index.rename('new name', inplace=True)

Ist der einzige, der den Job für mich macht (Pandas 0.22.0).
Ohne inplace = True ist der Name des Index in meinem Fall nicht festgelegt.

Jan H.
quelle
0

Sie können indexund columnsAttribute von verwenden pandas.DataFrame. HINWEIS: Die Anzahl der Elemente der Liste muss mit der Anzahl der Zeilen / Spalten übereinstimmen.

#       A   B   C
# ONE   11  12  13
# TWO   21  22  23
# THREE 31  32  33

df.index = [1, 2, 3]
df.columns = ['a', 'b', 'c']
print(df)

#     a   b   c
# 1  11  12  13
# 2  21  22  23
# 3  31  32  33
nucsit026
quelle