Jeg har en dataramme som heter data
. Hvordan kan jeg gi nytt navn til den eneste kolonneoverskriften? For eksempel gdp
til 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
En mye raskere implementering ville være å bruke list-comprehension
hvis du trenger å gi nytt navn til en enkelt kolonne.
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
Hvis du trenger å gi nytt navn til flere kolonner, kan du enten bruke betingede uttrykk som f.eks:
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
Eller konstruer en tilordning ved hjelp av en ordbok
og utfør listeforståelsen
med get
-operasjonen ved å angi standardverdien som det gamle navnet:
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]
Tidspunkter:
%%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
Hvordan gir jeg nytt navn til en spesifikk kolonne i pandas?
Fra v0.24+, for å gi nytt navn til én (eller flere) kolonner om gangen,
DataFrame.rename()
med axis=1
eller axis='columns'
(argumentet axis
ble introdusert i v0.21
.
Index.str.replace()
for streng/regex-basert erstatning.
Hvis du trenger å gi nytt navn til ALLE kolonnene samtidig,
DataFrame.set_axis()
metode med axis=1
. Overfør en listelignende sekvens. Alternativer er også tilgjengelige for endring på stedet.rename
med 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
Med 0.21+ kan du nå spesifisere en axis
-parameter med 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
(Vær oppmerksom på at rename
ikke er in-place som standard, så du må tilordne resultatet tilbake).
Dette tillegget er gjort for å forbedre konsistensen med resten av API-et. Det nye argumentet axis
er analogt med parameteren columns
- de gjør det samme.
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
godtar også en callback som kalles én gang for hver kolonne.
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
For dette spesifikke scenariet bør du bruke
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Index.str.replace
I likhet med replace
-metoden for strenger i python, definerer pandas Index og Series (kun objekttype) en ("vektorisert") str.replace
-metode for streng- og regex-basert erstatning.
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
Fordelen med denne fremfor de andre metodene er at str.replace
støtter regex (aktivert som standard). Se dokumentasjonen for mer informasjon.
set_axis
med axis=1
.Kaller set_axis
med en liste over overskrift(er). Listen må være like lang som kolonnene/indeksstørrelsen. set_axis
muterer den opprinnelige DataFrame som standard, men du kan spesifisere inplace=False
for å returnere en modifisert kopi.
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
Merk: I fremtidige versjoner vil inplace
som standard være True
.
**Kjeding av metoder
Hvorfor velge set_axis
når vi allerede har en effektiv måte å tilordne kolonner på med df.columns = ...
? Som vist av Ted Petrou i [dette svaret], (https://stackoverflow.com/a/46912050/4909087) er set_axis
nyttig når man prøver å kjede metoder.
Sammenlign
# 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()
Førstnevnte har en mer naturlig og flytende syntaks.