Mam ramkę danych przy użyciu pand i etykiet kolumn, które muszę edytować, aby zastąpić oryginalne etykiety kolumn.
Chciałbym zmienić nazwy kolumn w DataFrame, A
gdzie oryginalne nazwy kolumn to:
['$a', '$b', '$c', '$d', '$e']
do
['a', 'b', 'c', 'd', 'e'].
Mam edytowane nazwy kolumn zapisane na liście, ale nie wiem, jak zastąpić nazwy kolumn.
Odpowiedzi:
Po prostu przypisz go do
.columns
atrybutu:źródło
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.rename(columns = {'$b':'B'}, inplace = True)
ZMIEŃ NAZWY SPECJALNE KOLUMNY
Użyj
df.rename()
funkcji i odwołaj się do kolumn, których nazwy chcesz zmienić. Nie wszystkie kolumny muszą zostać zmienione:Przykład minimalnego kodu
Następujące metody działają i dają takie same wyniki:
Pamiętaj, aby przypisać wynik z powrotem, ponieważ modyfikacja nie jest na miejscu. Alternatywnie podaj
inplace=True
:Od wersji 0.25 można również określić
errors='raise'
zgłaszanie błędów, jeśli podano niepoprawną nazwę kolumny do zmiany. Zobacz dokumenty v0.25rename()
.PONOWNE PRZYPISANIE NAGŁÓWEK KOLUMNY
Użyj za
df.set_axis()
pomocąaxis=1
iinplace=False
(aby zwrócić kopię).Zwraca to kopię, ale możesz zmodyfikować DataFrame w miejscu, ustawiając
inplace=True
(jest to domyślne zachowanie dla wersji <= 0,24, ale prawdopodobnie zmieni się w przyszłości).Możesz także przypisać nagłówki bezpośrednio:
źródło
code
<klasa 'pandas.core.frame.DataFrame'> Int64Index: 1000 wpisów, 0 do 999 Kolumny danych: BodyMarkdown 1000code
działa bez wartości null , ale kiedy robię dataframe.head (), ponownie pojawiają się stare nazwy kolumn.SettingWithCopyWarning:
gdy użyję drugiego fragmentu kodu w tej odpowiedzi.df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
zmienia wyświetlaną nazwę, ale nie elementy w podstawowej strukturze danych. Więc jeśli spróbujeszdf['newName1']
, pojawi się błąd. Jestinplace=True
to konieczne, aby uniknąć tej gotchya.rename
Sposób może zająć funkcji , na przykład:źródło
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)
jest klejnotem, dzięki czemu możemy pisaćdf.Column_1_Name
zamiast pisaćdf.loc[:, 'Column 1 Name']
.Zgodnie z dokumentacją w pracy z danymi tekstowymi :
źródło
Pandy 0,21+ Odpowiedź
W wersji 0.21 wprowadzono kilka istotnych zmian w zmianie nazwy kolumny.
rename
Sposób dodałaxis
parametr, który może być ustawionycolumns
albo1
. Ta aktualizacja sprawia, że ta metoda jest zgodna z resztą interfejsu API pand. Nadal ma parametryindex
icolumns
, ale nie musisz już ich używać.set_axis
Metoda zinplace
zestawem doFalse
pozwala zmienić nazwy wszystkich etykiet indeksów lub kolumn z listy.Przykłady dla pand 0.21+
Skonstruuj przykładową ramkę danych:
Używanie
rename
zaxis='columns'
lubaxis=1
lub
Oba skutkują następującymi:
Nadal możliwe jest użycie starej sygnatury metody:
rename
Funkcja przyjmuje również funkcje, które będą stosowane nazwy każdej kolumny.lub
Używanie
set_axis
z listą iinplace=False
Do
set_axis
metody można podać listę o długości równej liczbie kolumn (lub indeksów). Obecnie jestinplace
domyślnie ustawiony naTrue
, aleinplace
zostanie przywróconyFalse
w przyszłych wydaniach.lub
Dlaczego nie użyć
df.columns = ['a', 'b', 'c', 'd', 'e']
?Nie ma nic złego w przypisywaniu kolumn bezpośrednio w ten sposób. To idealnie dobre rozwiązanie.
Zaletą użycia
set_axis
jest to, że może być używany jako część łańcucha metod i zwraca nową kopię DataFrame. Bez tego musielibyśmy zapisać swoje pośrednie kroki łańcucha do innej zmiennej przed ponownym przypisaniem kolumn.źródło
Pandas 0.21+ answer
- jakoś tęskniłem za częścią w części „Co nowego” ...(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
Ponieważ chcesz tylko usunąć znak $ we wszystkich nazwach kolumn, możesz po prostu zrobić:
LUB
źródło
Zastąpi istniejące nazwy podanymi przez Ciebie nazwami, w podanej przez Ciebie kolejności.
źródło
df.columns.values
, to źle. stackoverflow.com/questions/43291781/…W ten sposób możesz ręcznie edytować,
new_names
jak chcesz. Działa świetnie, gdy trzeba zmienić nazwę tylko kilku kolumn, aby poprawić błędy ortograficzne, akcenty, usunąć znaki specjalne itp.źródło
df.columns = ['a', 'b', 'c', 'd', 'e']
jest prostsze.df.columns.values
aby uzyskać stare nazwiska.myList = list(df) myList[10:20]
itp. - więc jest to idealne rozwiązanie.namez = df.columns.values
Następnie wprowadzić pewne zmianydf.columns = namez
.Rozwiązania z jedną linią lub rurociągiem
Skupię się na dwóch rzeczach:
OP jasno stwierdza
Nie chcę rozwiązać problemu zastąpienia
'$'
lub usunięcia pierwszego znaku z nagłówka każdej kolumny. OP już zrobił ten krok. Zamiast tego chcę skupić się na zamianie istniejącegocolumns
obiektu na nowy, biorąc pod uwagę listę nazw kolumn zastępczych.df.columns = new
gdzienew
lista nazw nowych kolumn jest tak prosta, jak to tylko możliwe. Wadą tego podejścia jest to, że wymaga edycjicolumns
atrybutu istniejącej ramki danych i nie jest wykonywany bezpośrednio. Pokażę kilka sposobów wykonania tego za pomocą potokowania bez edytowania istniejącej ramki danych.Konfiguracja 1
Aby skupić się na potrzebie zmiany nazwy zamiany nazw kolumn na wcześniej istniejącą listę, utworzę nową przykładową ramkę danych
df
z początkowymi nazwami kolumn i niepowiązanymi nowymi nazwami kolumn.Rozwiązanie 1
pd.DataFrame.rename
Mówiono już, że jeśli masz słownik odwzorowujący stare nazwy kolumn na nowe nazwy kolumn, możesz użyć
pd.DataFrame.rename
.Możesz jednak łatwo utworzyć ten słownik i dołączyć go do wywołania
rename
. Poniższe wykorzystuje fakt, że podczas iteracjidf
iterujemy nazwę każdej kolumny.Działa to świetnie, jeśli oryginalne nazwy kolumn są unikalne. Ale jeśli nie są, to się psuje.
Skonfiguruj 2
nieunikalne kolumny
Rozwiązanie 2
pd.concat
za pomocąkeys
argumentuNajpierw zauważ, co się dzieje, gdy próbujemy użyć rozwiązania 1:
Nie odwzorowaliśmy
new
listy jako nazw kolumn. Skończyło się to na powtarzaniuy765
. Zamiast tego możemy użyćkeys
argumentupd.concat
funkcji podczas iteracji po kolumnachdf
.Rozwiązanie 3
Zrekonstruuj. Tego należy użyć tylko, jeśli masz jeden
dtype
dla wszystkich kolumn. W przeciwnym razie skończyszdtype
object
na wszystkich kolumnach, a ich konwersja z powrotem wymaga większej pracy słownika.Pojedynczy
dtype
Mieszany
dtype
Rozwiązanie 4
To sztuczka z
transpose
iset_index
.pd.DataFrame.set_index
pozwala nam ustawić wbudowany indeks, ale nie ma odpowiadającegoset_columns
. Możemy więc przetransponowaćset_index
i przetransponować z powrotem. Jednak tutaj obowiązuje ten sam zastrzeżenie pojedynczegodtype
kontra mieszanegodtype
z rozwiązania 3.Pojedynczy
dtype
Mieszany
dtype
Roztwór 5
Przy użyciu
lambda
wpd.DataFrame.rename
tym, że przełącza się pomiędzy każdym elementemnew
W tym rozwiązaniu, przechodzimy lambda, które ma
x
ale ignorowany. To także zajmuje,y
ale się tego nie spodziewa. Zamiast tego iterator jest podawany jako wartość domyślna, a następnie mogę go używać do przełączania pojedynczo, bez względu na wartośćx
.I jak wskazali mi ludzie na czacie sopython , jeśli dodam
*
między nimix
iy
, mogę chronić mojąy
zmienną. Chociaż w tym kontekście nie uważam, że wymaga ochrony. Nadal warto o tym wspomnieć.źródło
df.rename(lambda x : x.lstrip('$'),axis=1)
x
jest ignorowany?Nazwy kolumn a nazwy serii
Chciałbym trochę wyjaśnić, co dzieje się za kulisami.
Ramki danych to zestaw Serii.
Serie z kolei są rozszerzeniem
numpy.array
numpy.array
mają własność.name
To jest nazwa serii. Rzadko zdarza się, aby pandy szanowały ten atrybut, ale utrzymuje się w różnych miejscach i można go wykorzystać do zhakowania niektórych zachowań pand.
Nazywanie listy kolumn
Wiele odpowiedzi tutaj mówi o tym,
df.columns
że atrybut jest,list
gdy w rzeczywistości jest toSeries
. Oznacza to, że ma.name
atrybut.Oto, co się stanie, jeśli zdecydujesz się wpisać nazwy kolumn
Series
:Pamiętaj, że nazwa indeksu zawsze znajduje się o jedną kolumnę niżej.
Artefakty, które pozostają
.name
Atrybut pokutuje czasem. Jeśli ustawisz,df.columns = ['one', 'two']
todf.one.name
będzie'one'
.Jeśli ustawisz
df.one.name = 'three'
następniedf.columns
będzie nadal daje['one', 'two']
, idf.one.name
daje'three'
ALE
pd.DataFrame(df.one)
wróciPonieważ pandy ponownie wykorzystują
.name
już zdefiniowaneSeries
.Nazwy kolumn wielopoziomowych
Pandy mają sposoby na tworzenie wielowarstwowych nazw kolumn. Nie ma w tym tyle magii, ale chciałem to również ująć w mojej odpowiedzi, ponieważ nie widzę tutaj nikogo, kto by to zauważył.
Można to łatwo osiągnąć, ustawiając kolumny na listy, takie jak to:
źródło
Jeśli masz ramkę danych, df.columns zrzuca wszystko do listy, którą możesz manipulować, a następnie ponownie przypisujesz ją do ramki danych jako nazwy kolumn ...
Najlepszym sposobem? NIE WIEM. Sposób - tak.
Lepszy sposób oceny wszystkich głównych technik przedstawionych w odpowiedziach na pytanie znajduje się poniżej przy użyciu cProfile do pomiaru pamięci i czasu wykonania. @kadee, @kaitlyn i @eumiro miały funkcje o najszybszym czasie wykonania - chociaż te funkcje są tak szybkie, że porównujemy zaokrąglenie 0,000 i 0,001 sekundy dla wszystkich odpowiedzi. Morał: moja powyższa odpowiedź prawdopodobnie nie jest „najlepsza”.
źródło
Powiedzmy, że to twoja ramka danych.
Możesz zmienić nazwę kolumn za pomocą dwóch metod.
Za pomocą
dataframe.columns=[#list]
Ograniczeniem tej metody jest to, że jeśli trzeba zmienić jedną kolumnę, należy przekazać pełną listę kolumn. Ponadto ta metoda nie ma zastosowania do etykiet indeksu. Na przykład, jeśli zdałeś:
Spowoduje to błąd. Niedopasowanie długości: oczekiwana oś ma 5 elementów, nowe wartości mają 4 elementy.
Inną metodą jest metoda Pandy
rename()
, która służy do zmiany nazwy dowolnego indeksu, kolumny lub wierszaPodobnie możesz zmienić dowolne wiersze lub kolumny.
źródło
Jeśli nowa lista kolumn jest w tej samej kolejności co istniejące kolumny, przypisanie jest proste:
Jeśli masz słownik ze starymi nazwami kolumn na nowe nazwy kolumn, możesz wykonać następujące czynności:
Jeśli nie masz odwzorowania listy lub słownika, możesz usunąć wiodący
$
symbol poprzez zrozumienie listy:źródło
lambda col: d[col]
ciebie mógłbyś zdaćd.get
... tak by to wyglądałodf.columns.map(d.get)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
źródło
Zobaczmy, jak zmienić nazwę na małym przykładzie ...
1. Zmiana nazw kolumn za pomocą mapowania:
2. Indeks nazw / nazwa_wiersza za pomocą mapowania:
źródło
Innym sposobem na zastąpienie oryginalnych etykiet kolumn jest usunięcie niechcianych znaków (tutaj „$”) z oryginalnych etykiet kolumn.
Można to zrobić, uruchamiając pętlę for nad df.columns i dołączając kolumny pozbawione do df.columns.
Zamiast tego możemy to zrobić porządnie w pojedynczym wyrażeniu, korzystając ze zrozumienia listy, takiego jak poniżej:
(
strip
metoda w Pythonie usuwa dany znak z początku i końca łańcucha).źródło
Naprawdę proste po prostu użyj
i przypisze nazwy kolumn według kolejności, w jakiej je umieściłeś
źródło
Możesz użyć
str.slice
do tego:źródło
df.columns.str[1:]
... prawdopodobnie lepiej go użyć, jest krótszy i bardziej oczywisty.Wiem, że to pytanie i odpowiedź została przeżuta na śmierć. Ale odniosłem się do niego w poszukiwaniu inspiracji do jednego z problemów, które miałem. Byłem w stanie go rozwiązać za pomocą fragmentów z różnych odpowiedzi, a zatem zapewniłem moją odpowiedź na wypadek, gdyby ktoś jej potrzebował.
Moja metoda jest ogólna, w której można dodawać dodatkowe ograniczniki, oddzielając przecinek
delimiters=
zmienną i zabezpieczając ją na przyszłość.Kod roboczy:
Wynik:
źródło
Należy pamiętać, że takie podejście nie działa w przypadku MultiIndex. W przypadku MultiIndex musisz zrobić coś takiego:
źródło
Inną opcją jest zmiana nazwy za pomocą wyrażenia regularnego:
źródło
Jeśli masz do czynienia z mnóstwem kolumn nazwanych przez system dostarczający poza twoją kontrolą, zaproponowałem następujące podejście, które jest połączeniem ogólnego podejścia i konkretnych zamienników za jednym razem.
Najpierw utwórz słownik na podstawie nazw kolumn ramki danych za pomocą wyrażeń regularnych, aby wyrzucić niektóre dodatki nazw kolumn, a następnie dodaj określone zamienniki do słownika, aby nazwać kolumny podstawowe zgodnie z oczekiwaniami w późniejszej bazie danych.
Jest to następnie stosowane do ramki danych za jednym razem.
źródło
Oprócz rozwiązania, które już zostało dostarczone, możesz zamienić wszystkie kolumny podczas czytania pliku. Możemy to wykorzystać
names
iheader=0
to zrobić.Najpierw tworzymy listę nazw, które lubimy używać jako nazwy kolumn:
W takim przypadku wszystkie nazwy kolumn zostaną zastąpione nazwami, które masz na liście.
źródło
Oto fajna mała funkcja, której lubię używać, aby ograniczyć pisanie:
Oto przykład tego, jak to działa:
źródło
Zmiana nazw kolumn w pandach jest łatwym zadaniem.
źródło
Zakładając, że możesz użyć wyrażenia regularnego. To rozwiązanie eliminuje potrzebę ręcznego kodowania przy użyciu wyrażenia regularnego
źródło