Redenumirea coloanei (coloanelor) specifice în pandas (Programare, Python, Pandas, Dataframe, Redenumiți)

natsuki_2002 a intrebat.

Am un cadru de date numit data. Cum aș putea redenumi doar un singur antet de coloană? De exemplu gdp în 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

5 răspunsuri
EdChum
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

The rename arată că acceptă un dict ca parametru pentru columns așa că trebuie doar să treceți un dict cu o singură intrare.

Vedeți, de asemenea, conex

Nickil Maveli

O implementare mult mai rapidă ar fi să folosiți list-comprehension dacă aveți nevoie să redenumiți o singură coloană.

df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]

Dacă apare necesitatea de a redenumi mai multe coloane, fie folosiți expresii condiționate de genul::

df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]

Sau, construiți o corespondență folosind o dictionary și efectuați list-comprehension cu ajutorul lui get stabilind valoarea implicită ca fiind vechiul nume:

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

Comentarii

  • Este oarecum ciudat că acest lucru este mai rapid. Presupun că folosiți DataFrame din întrebare, care are doar 3 coloane (y, gdp și cap). Dacă folosiți un număr mult mai mare de coloane, versiunea de înțelegere a listei este în continuare de aproximativ 3 ori mai rapidă decât cea care folosește redenumirea? sau o versiune devine mult mai rapidă decât cealaltă? –  > Por Leland Hepworth.
  • @LelandHepworth Mi se pare îndoielnic că autorii Pandas au fost preocupați de numărul de microsecunde necesare pentru redenumirea unei coloane. –  > Por c z.
cs95

Cum redenumesc o anumită coloană în pandas?

De la v0.24+, pentru a redenumi una (sau mai multe) coloane la un moment dat,

Dacă aveți nevoie să redenumiți TOATE coloanele deodată,

  • DataFrame.set_axis() metoda cu axis=1. Treceți o secvență de tip listă. Sunt disponibile opțiuni și pentru modificarea pe loc.

rename cu 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

Începând cu versiunea 0.21+, puteți specifica acum o opțiune axis parametru cu rename:

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

(Rețineți că rename nu este în loc în mod implicit, așa că va trebui să atribuiți rezultatul înapoi.)

Această adăugare a fost făcută pentru a îmbunătăți coerența cu restul API-ului. Noul axis este analog cu argumentul columns parametrul – ele fac același lucru.

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 acceptă, de asemenea, un callback care este apelat o dată pentru fiecare coloană.

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

Pentru acest scenariu specific, ar trebui să utilizați

df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)

Index.str.replace

Similar cu replace a șirurilor de caractere în python, pandas Index și Series (numai pentru tipul de obiect) definesc o metodă („vectorizată”) str.replace pentru înlocuirea bazată pe șiruri de caractere și regex.

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

Avantajul acesteia față de celelalte metode este că str.replace suportă regex (activat în mod implicit). Consultați documentația pentru mai multe informații.


Transmiterea unei liste către set_axis cu axis=1

Apel set_axis cu o listă de antet(e). Lista trebuie să aibă o lungime egală cu dimensiunea coloanelor/indexului. set_axis Mutarea este implicită în DataFrame original, dar puteți specifica inplace=False pentru a returna o copie modificată.

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

Notă: În versiunile viitoare, inplace va fi implicit la True.

Încatenarea metodelor
De ce să alegeți set_axis atunci când avem deja o modalitate eficientă de atribuire a coloanelor cu df.columns = ...? După cum a arătat Ted Petrou în acest răspuns set_axis este util atunci când se încearcă să se înlănțuiască metode.

Comparați

# 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()

Prima este o sintaxă mai naturală și mai liberă.

thdoan

Există cel puțin cinci moduri diferite de redenumire a coloanelor specifice în pandas și le-am enumerat mai jos, împreună cu linkuri către răspunsurile originale. Am cronometrat, de asemenea, aceste metode și am constatat că au aproximativ aceleași performanțe (deși YMMV în funcție de setul de date și scenariul dvs.). Cazul de testare de mai jos este de a redenumi coloane A M N Z la A2 M2 N2 Z2 într-un cadru de date cu coloane A la Z care conține un milion de rânduri.

# Import required modules
import numpy as np
import pandas as pd
import timeit

# Create sample data
df = pd.DataFrame(np.random.randint(0,9999,size=(1000000, 26)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))

# Standard way - https://stackoverflow.com/a/19758398/452587
def method_1():
    df_renamed = df.rename(columns={'A': 'A2', 'M': 'M2', 'N': 'N2', 'Z': 'Z2'})

# Lambda function - https://stackoverflow.com/a/16770353/452587
def method_2():
    df_renamed = df.rename(columns=lambda x: x + '2' if x in ['A', 'M', 'N', 'Z'] else x)

# Mapping function - https://stackoverflow.com/a/19758398/452587
def rename_some(x):
    if x=='A' or x=='M' or x=='N' or x=='Z':
        return x + '2'
    return x
def method_3():
    df_renamed = df.rename(columns=rename_some)

# Dictionary comprehension - https://stackoverflow.com/a/58143182/452587
def method_4():
    df_renamed = df.rename(columns={col: col + '2' for col in df.columns[
        np.asarray([i for i, col in enumerate(df.columns) if 'A' in col or 'M' in col or 'N' in col or 'Z' in col])
    ]})

# Dictionary comprehension - https://stackoverflow.com/a/38101084/452587
def method_5():
    df_renamed = df.rename(columns=dict(zip(df[['A', 'M', 'N', 'Z']], ['A2', 'M2', 'N2', 'Z2'])))

print('Method 1:', timeit.timeit(method_1, number=10))
print('Method 2:', timeit.timeit(method_2, number=10))
print('Method 3:', timeit.timeit(method_3, number=10))
print('Method 4:', timeit.timeit(method_4, number=10))
print('Method 5:', timeit.timeit(method_5, number=10))

Ieșire:

Method 1: 3.650640267
Method 2: 3.163998427
Method 3: 2.998530871
Method 4: 2.9918436889999995
Method 5: 3.2436501520000007

Folosiți metoda cea mai intuitivă pentru dumneavoastră și cea mai ușor de implementat în aplicația dumneavoastră.

Rathan

Utilizați metoda pandas.DataFrame.rename Funcția.Verificați acest lucru link pentru descriere.

data.rename(columns = {'gdp': 'log(gdp)'}, inplace = True)

Dacă intenționați să redenumiți mai multe coloane, atunci

data.rename(columns = {'gdp': 'log(gdp)', 'cap': 'log(cap)', ..}, inplace = True)