Zmiana konkretnej nazwy kolumny w pandach DataFrame

195

Szukałem eleganckiego sposobu na zmianę określonej nazwy kolumny w DataFrame.

odtwórz dane ...

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)

Najbardziej eleganckie rozwiązanie, jakie do tej pory znalazłem ...

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

Miałem nadzieję na prosty liniowiec ... ta próba się nie udała ...

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

Wszelkie wskazówki otrzymane z wdzięcznością.

Zaznacz wykres
źródło

Odpowiedzi:

355

Istnieje jedna wkładka:

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

Poniżej znajduje się dokumentacja renamemetody.

Definicja: df.rename (self, index = None, columns = None, copy = True, inplace = False)
Docstring:
Zmień indeks i / lub kolumny za pomocą funkcji wprowadzania lub
Funkcje. Wartości funkcji / dict muszą być unikalne (1 do 1). Etykiety nie
zawarte w nagraniu / Serii pozostaną takie, jakie są.

Parametry
----------
indeks: podobny do dykta lub funkcji, opcjonalny
    Transformacja stosowana do wartości indeksu
kolumny: dyktopodobne lub funkcyjne, opcjonalne
    Transformacja stosowana do wartości kolumn
copy: boolean, domyślnie True
    Kopiuj również dane bazowe
inplace: boolean, domyślnie False
    Określa, czy zwrócić nową ramkę danych. Jeśli Prawda, to wartość kopii wynosi
    zignorowany.

Zobacz też
--------
Series.rename

Zwroty
-------
przemianowano: DataFrame (nowy obiekt)
Nipun Batra
źródło
To nie działa dla mnie, chyba że użyję inplace = True, jak pokazano w odpowiedzi @ Jeong-Yoon Lee.
JStrahl
108

Ponieważ inplaceargument jest dostępny, nie trzeba kopiować i przypisywać oryginalnej ramki danych z powrotem do siebie, ale wykonaj następujące czynności:

df.rename(columns={'two':'new_name'}, inplace=True)
Jeong-Yoon Lee
źródło
39

Co powiesz na?

df.columns.values[2] = "new_name"
Jacob H.
źródło
11
tak naprawdę to nie działa, jeśli później użyjesz nazwy kolumny w innych operacjach, takich jak w df ['nowa_nazwa']
Master Jogurt
4
ta odpowiedź była dla mnie przydatna do zmiany konkretnej kolumny na nową nazwę. Pierwsza kolumna to indeks 0, druga kolumna to indeks 1 itd. fajne rozwiązanie ... i jestem pewien, że pomoże to większej liczbie osób, ponieważ inne rozwiązania wymagają wcześniejszego poznania i skopiowania oryginalnych nazw kolumn ... podczas gdy jest to szybka i brudna metoda .. która ma swoje własne zastosowania.
ihightower 30.09.17
1
@MasterYogurt Twój komentarz jest nieprawidłowy. Możliwe jest wykonywanie df['new_name'](i innych rzeczy pand) po zmianie zmiennych, jak opisano powyżej. Twój komentarz mógł być ważny, kiedy został pierwotnie opublikowany.
Jakub H
1
Biorąc to pod uwagę, stosowanie renamemetod jest lepszym rozwiązaniem.
Jakub H
6

Panda 0.21 ma teraz parametr osi

Metoda zmiany nazwy uzyskała parametr osi, który pasuje do większości pozostałych funkcji API pand.

Oprócz tego:

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

Możesz to zrobić:

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

lub

df.rename({'two':'new_name'}, axis='columns')
Ted Petrou
źródło
df.rename ({'two': 'new_name'}, axis = 'columns') Zgłasza błąd typu: Nie można podać zarówno „osi”, jak i żadnego z „indeksów” lub „kolumn”.
Tutaj
@HereHere Upewnij się, że korzystasz z wersji pandy 0.21. Zrobić pd.__version__, aby sprawdzić wersję
Ted Petrou
5

Jeśli wiesz, która to kolumna # (pierwsza / druga / n-ta), to rozwiązanie opublikowane na podobne pytanie działa niezależnie od tego, czy jest nazwane czy nienazwane, i w jednym wierszu: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)
Nikhil VJ
źródło
3

Tutaj zmiana nazwy kolumn jest prosta, która będzie działać dla obu Default(0,1,2,etc;)i istniejących kolumn, ale nie będzie zbyt użyteczna dla większych zestawów danych (posiadających wiele kolumn).

W przypadku większego zestawu danych możemy pokroić potrzebne kolumny i zastosować poniższy kod:

df.columns = ['new_name','new_name1','old_name']
Naveen Reddy
źródło
2

Poniższy krótki kod może pomóc:

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

Usuń spacje z kolumn.

Emmanuel Masabo
źródło
Ciągle dostawałem, czy AttributeError: 'int' object has no attribute 'replace'mógłbyś to rozwinąć.
Nirmal
2

wersja pandy 0.23.4

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

Dla przypomnienia:

pominięcie indeksu = str spowoduje błąd zastąpienie ma nieoczekiwany argument „kolumny”

Kallol Medhi
źródło
1

Inną opcją byłoby po prostu skopiowanie i upuszczenie kolumny:

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

Następnie otrzymasz wynik:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5
anka
źródło
2
Ta metoda nie pomoże, jeśli kolejność indeksów kolumn jest ważna. Nowa kolumna zostanie utworzona na końcu.
Loochie