web-dev-qa-db-de.com

Benennen Sie bestimmte Spalten in pandas

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
146
natsuki_2002
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

Das rename zeigt, dass es ein Diktat als Parameter für columns akzeptiert, sodass Sie nur ein Diktat mit einem einzigen Eintrag übergeben.

Siehe auch verwandt

281
EdChum

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
20
Nickil Maveli

Wie benenne ich eine bestimmte Spalte in Pandas um?

Ab Version 0.24 + können Sie eine (oder mehrere) Spalten gleichzeitig umbenennen.

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.


Übergeben einer Liste an 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.

10
cs95