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.

Author: jmuhlenkamp, 2012-07-05

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
 1186
Author: eumiro,
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)
 1947
Author: lexual,
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)
 305
Author: Andy Hayden,
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('$','')
 129
Author: kadee,
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)
 116
Author: paulo.filip3,
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 parametr axis, który można ustawić na columns lub 1. Ta aktualizacja sprawia, że ta metoda pasuje do reszty API pandas. Nadal ma parametry index i columns, ale nie jesteś już zmuszony ich używać.
  • The set_axis metoda Z inplace ustawioną na False 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()
 102
Author: Ted Petrou,
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.

 68
Author: M PAUL,
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.

 54
Author: migloo,
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.

 37
Author: wolfog,
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.arrays 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']]
 31
Author: firelynx,
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:

  1. 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 obiektu columns nowym podano listę nazw kolumn zastępczych.

  2. 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 atrybutu columns 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 1
pd.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 2
pd.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
 28
Author: piRSquared,
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.

 19
Author: flowera,
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]
 16
Author: Alexander,
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)')
 15
Author: andrewwowens,
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

 12
Author: lf2225,
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.)

 11
Author: kait,
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
 10
Author: Anil_M,
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ś

 9
Author: Thodoris P,
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)
 9
Author: Anton Protopopov,
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
 8
Author: Yog,
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
 7
Author: oxer,
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(' ', '_')
 7
Author: Sankar guru,
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)
 4
Author: matthhias,
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
 4
Author: sbha,
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"})
 3
Author: Nodar Okroshiashvili,
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]

 2
Author: Domnick,
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')
 2
Author: seeiespi,
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
 1
Author: M.r_L,
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