Zmiana nazwy kolumn w pandach
Mam ramkę danych używającą pand i etykiet kolumn, które muszę edytować, aby zastąpić oryginalne etykiety kolumn.
Chciałbym zmienić nazwy kolumn w ramce danych 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.
28 answers
Po prostu przypisz go do atrybutu .columns
:
>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
a b
0 1 10
1 2 20
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-05 14:23:27
Użyj df.rename()
funkcji i odnoszą się do kolumn, które mają zostać przemianowane. Nie wszystkie kolumny muszą zostać zmienione:
df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy)
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 17:39:42
The rename
Metoda może przyjmować funkcję, na przykład:
In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)
In [12]: df.rename(columns=lambda x: x[1:], inplace=True)
In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-21 09:58:59
Jak udokumentowano w http://pandas.pydata.org/pandas-docs/stable/text.html :
df.columns = df.columns.str.replace('$','')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-30 13:24:05
Ponieważ chcesz usunąć tylko znak $ we wszystkich nazwach kolumn, możesz po prostu zrobić:
df = df.rename(columns=lambda x: x.replace('$', ''))
Lub
df.rename(columns=lambda x: x.replace('$', ''), inplace=True)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-26 10:20:45
Pandy 0.21 + Odpowiedz
W wersji 0.21 pojawiły się znaczące aktualizacje zmiany nazwy kolumn.
- The
rename
metoda dodała parametraxis
, który można ustawić nacolumns
lub1
. Ta aktualizacja sprawia, że ta metoda pasuje do reszty API pandas. Nadal ma parametryindex
icolumns
, ale nie jesteś już zmuszony ich używać. - The
set_axis
metoda Zinplace
ustawioną naFalse
umożliwia zmianę nazwy całego indeksu lub etykiety kolumn z listą.
Przykłady pand 0.21 +
Skonstruuj przykładową ramkę danych:
df = pd.DataFrame({'$a':[1,2], '$b': [3,4],
'$c':[5,6], '$d':[7,8],
'$e':[9,10]})
$a $b $c $d $e
0 1 3 5 7 9
1 2 4 6 8 10
Używając rename
z axis='columns'
lub axis=1
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')
Lub
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)
Oba dają następujące wyniki:
a b c d e
0 1 3 5 7 9
1 2 4 6 8 10
Nadal możliwe jest użycie podpisu starej metody:
df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})
Funkcja rename
akceptuje również funkcje, które będą stosowane do każdej nazwy kolumny.
df.rename(lambda x: x[1:], axis='columns')
Lub
df.rename(lambda x: x[1:], axis=1)
Używając set_axis
z lista i inplace=False
Do metody set_axis
można podać listę o długości równej liczbie kolumn (lub indeksu). Obecnie inplace
domyślnie True
, Ale inplace
będzie domyślnie False
w przyszłych wydaniach.
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)
Lub
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)
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 doskonałe rozwiązanie.
Zaletą stosowania set_axis
jest to, że może być stosowany jako część łańcuch metod i że zwraca nową kopię ramki danych. Bez niego, przed ponownym przypisaniem kolumn trzeba by zapisać swoje pośrednie kroki łańcucha do innej zmiennej.
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 19:31:57
df.columns = ['a', 'b', 'c', 'd', 'e']
Zastąpi istniejące nazwy nazwami podanymi przez Ciebie, w podanej kolejności.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 05:45:57
old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)
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, akcenty, usunąć znaki specjalne itp.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 17:54:25
Myślę, że ta metoda jest przydatna:
df.rename(columns={"old_column_name1":"new_column_name1", "old_column_name2":"new_column_name2"})
Ta metoda pozwala na indywidualną zmianę nazw kolumn.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 08:08:00
Nazwy kolumn a nazwy serii
Chciałbym wyjaśnić trochę, co dzieje się za kulisami.
Ramki danych są zbiorem szeregów.
Seria z kolei jest rozszerzeniem numpy.array
numpy.array
s mają właściwość .name
To jest nazwa serii. Rzadko zdarza się, że pandy szanują ten atrybut, ale utrzymuje się on w miejscach i może być użyty do zhakowania niektórych zachowań pand.
Nazwanie listy kolumn
Wiele odpowiedzi tutaj mówi się o df.columns
atrybut jest list
, podczas gdy w rzeczywistości jest Series
. Oznacza to, że posiada atrybut .name
.
Tak się dzieje, jeśli zdecydujesz się wypełnić nazwę kolumn Series
:
df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']
name of the list of columns column_one column_two
name of the index
0 4 1
1 5 2
2 6 3
Zauważ, że nazwa indeksu jest zawsze o jedną kolumnę niżej.
Artefakty, które pozostają
Atrybut .name
pozostaje czasami. Jeśli ustawisz df.columns = ['one', 'two']
, to df.one.name
będzie 'one'
.
Jeśli ustawisz df.one.name = 'three'
to df.columns
nadal da ci ['one', 'two']
, i df.one.name
da ci 'three'
Ale
pd.DataFrame(df.one)
will return
three
0 1
1 2
2 3
Ponieważ pandy ponownie wykorzystują .name
już zdefiniowanego Series
.
Wielopoziomowe nazwy kolumn
Pandy mają sposoby tworzenia wielowarstwowych nazw kolumn. Nie ma w tym zbyt wiele magii, ale też chciałem to opisać w mojej odpowiedzi, ponieważ nie widzę nikogo, kto by się o tym tutaj dowiedział.
|one |
|one |two |
0 | 4 | 1 |
1 | 5 | 2 |
2 | 6 | 3 |
Można to łatwo osiągnąć, ustawiając kolumny na listy, tak:
df.columns = [['one', 'one'], ['one', 'two']]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 12:30:40
Rozwiązania jednej linii lub rurociągu
Skupię się na dwóch rzeczach:
-
OP wyraźnie stwierdza
Mam edytowane nazwy kolumn zapisane na liście, ale nie wiem, jak zastąpić nazwy kolumn.
Nie chcę rozwiązywać problemu, jak zastąpić
'$'
lub usunąć pierwszy znak z nagłówka każdej kolumny. Operacja już to zrobiła. Zamiast tego chcę skupić się na zastąpieniu istniejącego obiektucolumns
nowym podano listę nazw kolumn zastępczych. df.columns = new
gdzie {[15] } jest lista nazw nowych kolumn jest tak prosta, jak to tylko możliwe. Wadą tego podejścia jest to, że wymaga edycji istniejącego atrybutucolumns
dataframe i nie jest to wykonywane w linii. Pokażę kilka sposobów, aby wykonać to poprzez pipelining bez edycji istniejącej ramki danych.
Setup 1
Aby skupić się na konieczności zmiany nazw kolumn zastąp na istniejące lista, stworzę nowy przykładowy dataframe df
z początkowymi nazwami kolumn i niepowiązanymi nowymi nazwami kolumn.
df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']
df
Jack Mahesh Xin
0 1 3 5
1 2 4 6
Rozwiązanie 1pd.DataFrame.rename
Mówi się już, że jeśli masz słownik mapujący stare nazwy kolumn na nowe, możesz użyć pd.DataFrame.rename
.
d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)
x098 y765 z432
0 1 3 5
1 2 4 6
Można jednak łatwo utworzyć ten słownik i dołączyć go do wywołania rename
. Z faktu, że podczas iteracji nad df
, iterujemy nad każdą nazwą kolumny.
# given just a list of new column names
df.rename(columns=dict(zip(df, new)))
x098 y765 z432
0 1 3 5
1 2 4 6
To działa świetnie, jeśli oryginalne nazwy kolumn są unikalne. Ale jeśli nie, to się psuje.
Setup 2
unikalne kolumny
df = pd.DataFrame(
[[1, 3, 5], [2, 4, 6]],
columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']
df
Mahesh Mahesh Xin
0 1 3 5
1 2 4 6
Rozwiązanie 2pd.concat
użycie argumentu keys
Najpierw zwróć uwagę, co się dzieje, gdy spróbujemy użyć rozwiązania 1:
df.rename(columns=dict(zip(df, new)))
y765 y765 z432
0 1 3 5
1 2 4 6
Nie mapowaliśmy new
listy jako nazwy kolumn. Skończyło się na powtórzeniu y765
. Zamiast tego możemy użyć argumentu keys
funkcji pd.concat
podczas iteracji przez kolumny df
.
pd.concat([c for _, c in df.items()], axis=1, keys=new)
x098 y765 z432
0 1 3 5
1 2 4 6
Rozwiązanie 3
Rekonstrukcja. To powinno być używane tylko wtedy, gdy masz pojedynczy dtype
dla wszystkich kolumn. W przeciwnym razie skończysz z dtype
object
dla wszystkich kolumn i konwersja ich z powrotem wymaga więcej pracy słownika.
Single dtype
pd.DataFrame(df.values, df.index, new)
x098 y765 z432
0 1 3 5
1 2 4 6
mieszane dtype
pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))
x098 y765 z432
0 1 3 5
1 2 4 6
Rozwiązanie 4
Jest to sztuczka z transpose
i set_index
. pd.DataFrame.set_index
pozwala nam ustawić indeks w linii, ale nie ma odpowiadającego mu set_columns
. Więc możemy transponować, a następnie set_index
i transponować z powrotem. Jednakże dotyczy to tego samego pojedynczego dtype
i mieszanego dtype
zastrzeżenia z rozwiązania 3.
Single dtype
df.T.set_index(np.asarray(new)).T
x098 y765 z432
0 1 3 5
1 2 4 6
mieszane dtype
df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))
x098 y765 z432
0 1 3 5
1 2 4 6
Rozwiązanie 5
Użyj lambda
W pd.DataFrame.rename
, który przechodzi przez każdy element new
W tym rozwiązaniu mijamy lambdę, która bierze x
, ale potem ją ignoruje. Wymaga również y
, ale nie oczekuje tego. Zamiast tego, iterator jest podawany jako wartość domyślna i mogę go użyć do przełączania po jednym na raz, bez względu na to, jaka jest wartość x
.
df.rename(columns=lambda x, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6
I jak wskazali mi ludzie wsopython czacie, jeśli dodaj *
pomiędzy x
a y
, mogę chronić swoją zmienną y
. Chociaż w tym kontekście nie sądzę, że wymaga to Ochrony. Warto o tym wspomnieć.
df.rename(columns=lambda x, *, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 09:10:15
DataFrame -- df.funkcja rename() będzie działać.
df.rename(columns = {'Old Name':'New Name'})
Df to ramka danych, którą posiadasz, a stara nazwa to nazwa kolumny, którą chcesz zmienić, to nowa nazwa jest nową nazwą, na którą zmieniasz. Ta Wbudowana metoda ramki danych sprawia, że wszystko jest bardzo łatwiejsze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-15 16:25:03
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})
Jeśli nowa lista kolumn jest w tej samej kolejności co istniejące kolumny, przypisanie jest proste:
new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
a b c d e
0 1 1 1 1 1
Jeśli masz słownik z kluczem na starych nazw kolumn do nowych nazw kolumn, możesz wykonać następujące czynności:
d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col]) # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
a b c d e
0 1 1 1 1 1
Jeśli nie masz mapowania listy lub słownika, możesz usunąć wiodący symbol $
za pomocą rozumienia listy:
df.columns = [col[1:] if col[0] == '$' else col for col in df]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 12:24:31
Jeśli masz ramkę danych, df.kolumny zrzucają wszystko do listy, którą można manipulować, a następnie przypisać do ramki danych jako nazwy kolumn...
columns = df.columns
columns = [row.replace("$","") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() #to validate the output
Najlepszy sposób? IDK. Sposób-tak.
Lepszy sposób oceny wszystkich głównych technik przedstawionych w odpowiedziach na pytanie znajduje się poniżej za pomocą cProfile do gage memory & execution time. @kadee, @ kaitlyn, & @eumiro miał funkcje z najszybszym czasem wykonania-choć te funkcje są tak szybkie, że jesteśmy porównując zaokrąglenia .000 i .001 sekund na wszystkie odpowiedzi. Morał: moja odpowiedź powyżej prawdopodobnie nie jest "najlepszym" sposobem.
import pandas as pd
import cProfile, pstats, re
old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b','$c':'c','$d':'d','$e':'e'}
df = pd.DataFrame({'$a':[1,2], '$b': [10,20],'$c':['bleep','blorp'],'$d':[1,2],'$e':['texa$','']})
df.head()
def eumiro(df,nn):
df.columns = nn
#This direct renaming approach is duplicated in methodology in several other answers:
return df
def lexual1(df):
return df.rename(columns=col_dict)
def lexual2(df,col_dict):
return df.rename(columns=col_dict, inplace=True)
def Panda_Master_Hayden(df):
return df.rename(columns=lambda x: x[1:], inplace=True)
def paulo1(df):
return df.rename(columns=lambda x: x.replace('$', ''))
def paulo2(df):
return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)
def migloo(df,on,nn):
return df.rename(columns=dict(zip(on, nn)), inplace=True)
def kadee(df):
return df.columns.str.replace('$','')
def awo(df):
columns = df.columns
columns = [row.replace("$","") for row in columns]
return df.rename(columns=dict(zip(columns, '')), inplace=True)
def kaitlyn(df):
df.columns = [col.strip('$') for col in df.columns]
return df
print 'eumiro'
cProfile.run('eumiro(df,new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df,col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df,old_names,new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 02:24:19
df = df.rename(columns=lambda n: n.replace('$', ''))
Jest funkcjonalnym sposobem rozwiązania tego
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 08:07:43
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.kolumny i dołączanie rozebranych kolumn do df.kolumny.
Zamiast tego, możemy to zrobić porządnie w jednym oświadczeniu, używając rozumienia listy, jak poniżej:
df.columns = [col.strip('$') for col in df.columns]
(strip
Metoda w Pythonie usuwa podany znak z początku i końca łańcucha.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 13:19:35
Wiem, że to pytanie i odpowiedź została przeżuta na śmierć. Ale odwołałem się do niego dla inspiracji dla jednego z problemów, które miałem . Udało mi się to rozwiązać za pomocą fragmentów z różnych odpowiedzi, dzięki czemu udzielam odpowiedzi na wypadek, gdyby ktoś tego potrzebował.
Moja metoda jest ogólna, w której można dodać dodatkowe ograniczniki przez przecinek oddzielający zmienną delimiters=
i przyszłościową.
Kod Roboczy:
import pandas as pd
import re
df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})
delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]
Wyjście:
>>> df
$a $b $c $d $e
0 1 3 5 7 9
1 2 4 6 8 10
>>> df
a b c d e
0 1 3 5 7 9
1 2 4 6 8 10
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 20:26:50
Real simple just use
df.columns = ['Name1', 'Name2', 'Name3'...]
I przypisze nazwy kolumn według kolejności, w jakiej je umieściłeś
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-29 19:22:47
You could use str.slice
za to:
df.columns = df.columns.str.slice(1)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 17:31:39
df.rename(index=str,columns={'A':'a','B':'b'})
Https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 13:35:39
Zauważ, że takie podejście nie działa dla MultiIndex. W przypadku multiindexu musisz zrobić coś takiego:
>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
$a $b e
$x $y f
0 1 3 5
1 2 4 6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
rename.get(item, item) for item in df.columns.tolist()])
>>> df
a b e
x y f
0 1 3 5
1 2 4 6
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 21:27:20
Zmiana nazwy kolumn ramki danych i zastąpienie formatu
import pandas as pd
data = {'year':[2015,2011,2007,2003,1999,1996,1992,1987,1983,1979,1975],
'team':['Australia','India','Australia','Australia','Australia','Sri Lanka','Pakistan','Australia','India','West Indies','West Indies'],
}
df = pd.DataFrame(data)
#Rename Columns
df.rename(columns={'year':'Years of Win','team':'Winning Team'}, inplace=True)
#Replace format
df = df.columns.str.replace(' ', '_')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 09:02:02
Jeśli masz do czynienia z mnóstwem kolumn nazwanych przez system dostarczający poza Twoją kontrolą, wymyśliłem następujące podejście, które jest połączeniem ogólnego podejścia i konkretnych zamienników za jednym razem.
Najpierw tworzę słownik z nazw kolumn dataframe używając wyrażeń regex w celu wyrzucenia niektórych załączników nazw kolumn a następnie dodaję konkretne zamienniki do słownika, aby nazwać podstawowe kolumny zgodnie z oczekiwaniami później w odbiorze baza danych.
Jest to następnie stosowane do ramki danych za jednym zamachem.
dict=dict(zip(df.columns,df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)','')))
dict['brand_timeseries:C1']='BTS'
dict['respid:L']='RespID'
dict['country:C1']='CountryID
dict['pim1:D']='pim_actual'
df.rename(columns=dict, inplace=True)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 08:27:37
Inną opcją jest zmiana nazwy za pomocą wyrażenia regularnego:
import pandas as pd
import re
df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})
df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
a b c
0 1 3 5
1 2 4 6
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-07 02:07:23
Spróbuj tego. It works for me
df.rename(index=str, columns={"$a": "a", "$b": "b", "$c" : "c", "$d" : "d", "$e" : "e"})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 08:07:06
W przypadku gdy nie chcesz nazw wierszy df.columns = ['a', 'b',index=False]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-02 05:17:38
Oto sprytna mała funkcja, której lubię używać do cięcia przy pisaniu:
def rename(data, oldnames, newname):
if type(oldnames) == str: #input can be a string or list of strings
oldnames = [oldnames] #when renaming multiple columns
newname = [newname] #make sure you pass the corresponding list of new names
i = 0
for name in oldnames:
oldvar = [c for c in data.columns if name in c]
if len(oldvar) == 0:
raise ValueError("Sorry, couldn't find that column in the dataset")
if len(oldvar) > 1: #doesn't have to be an exact match
print("Found multiple columns that matched " + str(name) + " :")
for c in oldvar:
print(str(oldvar.index(c)) + ": " + str(c))
ind = input('please enter the index of the column you would like to rename: ')
oldvar = oldvar[int(ind)]
if len(oldvar) == 1:
oldvar = oldvar[0]
data = data.rename(columns = {oldvar : newname[i]})
i += 1
return data
Oto przykład jak to działa:
In [2]: df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['col1','col2','omg','idk'])
#first list = existing variables
#second list = new names for those variables
In [3]: df = rename(df, ['col','omg'],['first','ohmy'])
Found multiple columns that matched col :
0: col1
1: col2
please enter the index of the column you would like to rename: 0
In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 23:36:09
Renaming columns while reading the Dataframe:
>>> df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1]}).rename(columns =
{'$a' : 'a','$b':'b','$c':'c'})
Out[1]:
a b c
0 1 1 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 08:38:08