De naam van specifieke kolom(men) in panda’s wijzigen

Ik heb een dataframe met de naam data. Hoe zou ik de enige kolomkop hernoemen? Bijvoorbeeld gdpnaar 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

Antwoord 1, autoriteit 100%

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

De renamelaten zien dat het een dictaat accepteert als parameter voor columns, dus je geeft een dictaat door met een enkele invoer.

Zie ook gerelateerd


Antwoord 2, autoriteit 8%

Een veel snellere implementatie zou zijn om list-comprehensionte gebruiken als u een enkele kolom moet hernoemen.

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

Als de noodzaak zich voordoet om meerdere kolommen te hernoemen, gebruik dan voorwaardelijke expressies zoals:

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

Of maak een mapping met behulp van een dictionaryen voer de list-comprehensionuit met zijn get-bewerking door de standaardwaarde in te stellen als de oude naam :

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

Antwoord 3, Autoriteit 5%

Hoe hernoem ik een specifieke kolom in Panda’s?

Vanaf v0.24 +, om één (of meer) kolommen tegelijk te hernoemen,

Als u alle kolommen tegelijk hernoemt,

  • DataFrame.set_axis()methode met axis=1. Passeer een lijstachtige reeks. Opties zijn ook beschikbaar voor een in-peilige wijziging.

renamemet 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

Met 0.21+ kunt u nu een axisParameter met 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

(Houd er rekening mee dat renamestandaard niet in de plaats is, zodat u het resultaat teruggeeft .)

Deze toevoeging is gemaakt om de consistentie met de rest van de API te verbeteren. De nieuwe axisargument is analoog aan de columnsparameter – ze doen hetzelfde.

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

renameAccepteert ook een terugbellen die eenmaal voor elke kolom wordt genoemd.

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

Voor dit specifieke scenario zou u

willen gebruiken

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

Index.str.replace

Vergelijkbaar met de replacemethode van strings in python, panda’s Index en Series (alleen object dtype) definiëren een (“gevectoriseerde”) str.replacemethode voor string en regex -gebaseerde vervanging.

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

Het voordeel hiervan ten opzichte van de andere methoden is dat str.replaceregex ondersteunt (standaard ingeschakeld). Zie de documenten voor meer informatie.


Een lijst doorgeven aan set_axismet axis=1

Bel set_axismet een lijst van header(s). De lijst moet even lang zijn als de kolommen/indexgrootte. set_axismuteert standaard het originele DataFrame, maar u kunt inplace=Falsespecificeren om een gewijzigde kopie terug te sturen.

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

Opmerking: in toekomstige releases zal inplacestandaard Truezijn.

Methode Chaining
Waarom kiezen voor set_axisals we al een efficiënte manier hebben om kolommen toe te wijzen met df.columns = ...? Zoals Ted Petrou laat zien in dit antwoordset_axisis handig bij het koppelen van methoden.

Vergelijk

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

De eerste is een meer natuurlijke en vrij vloeiende syntaxis.


Antwoord 4

Er zijn minstens vijf verschillende manieren om specifieke kolommen in panda’s te hernoemen, en ik heb ze hieronder vermeld, samen met links naar de originele antwoorden. Ik heb deze methoden ook getimed en ontdekte dat ze ongeveer hetzelfde presteren (hoewel YMMV afhankelijk is van je dataset en scenario). De onderstaande testcase is om kolommen AMNZte hernoemen naar A2M2N2Z2in een dataframe met kolommen Atot Zdie een miljoen rijen bevatten.

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

Uitvoer:

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

Gebruik de methode die voor u het meest intuïtief is en voor u het gemakkelijkst te implementeren in uw toepassing.


Antwoord 5

Gebruik de functie pandas.DataFrame.rename.
Bekijk deze linkvoor een beschrijving.

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

Als u van plan bent meerdere kolommen te hernoemen,

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

Other episodes