Ik heb een dataframe met de naam data
. Hoe zou ik de enige kolomkop hernoemen? Bijvoorbeeld gdp
naar 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 rename
laten 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-comprehension
te 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 dictionary
en voer de list-comprehension
uit 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,
-
DataFrame.rename()
metaxis=1
ofaxis='columns'
(deaxis
argument is geïntroduceerd inv0.21
. -
Index.str.replace()
voor op string / regex gebaseerde vervanging.
Als u alle kolommen tegelijk hernoemt,
DataFrame.set_axis()
methode metaxis=1
. Passeer een lijstachtige reeks. Opties zijn ook beschikbaar voor een in-peilige wijziging.
rename
met 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 axis
Parameter 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 rename
standaard 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 axis
argument is analoog aan de columns
parameter – 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
rename
Accepteert 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 replace
methode van strings in python, panda’s Index en Series (alleen object dtype) definiëren een (“gevectoriseerde”) str.replace
methode 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.replace
regex ondersteunt (standaard ingeschakeld). Zie de documenten voor meer informatie.
Een lijst doorgeven aan set_axis
met axis=1
Bel set_axis
met een lijst van header(s). De lijst moet even lang zijn als de kolommen/indexgrootte. set_axis
muteert standaard het originele DataFrame, maar u kunt inplace=False
specificeren 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 inplace
standaard True
zijn.
Methode Chaining
Waarom kiezen voor set_axis
als we al een efficiënte manier hebben om kolommen toe te wijzen met df.columns = ...
? Zoals Ted Petrou laat zien in dit antwoordset_axis
is 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 A
M
N
Z
te hernoemen naar A2
M2
N2
Z2
in een dataframe met kolommen A
tot Z
die 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)