Du har fire viktigste valg for konvertering typer i pandaer:
Les videre for mer detaljerte forklaringer og bruk av hver av disse metodene.
Den beste måten å konvertere en eller flere kolonner i en DataFrame til numeriske verdier er å bruke pandas.to_numeric()
.
Denne funksjonen vil prøve å endre ikke-numeriske objekter (for eksempel strenger) inn heltall eller flyttall som hensiktsmessig.
Grunnleggende bruk
input til to_numeric()
er en Serie eller en enkelt kolonne av en DataFrame.,
Som du kan se, en ny Serie er tilbake. Husk å overdra denne utgang til en variabel eller kolonne navn for å fortsette med det:
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
Du kan også bruke den til å konvertere flere kolonner i en DataFrame via apply()
metode:
Så lenge dine verdier kan alle bli konvertert, det er sannsynligvis alt du trenger.
Feil håndtering
Men hva hvis noen verdier ikke kan konverteres til en numerisk type?,
to_numeric()
tar også en errors
søkeord argument som gir deg mulighet til å tvinge ikke-numeriske verdier for å være NaN
, eller rett og slett ignorere kolonner som inneholder disse verdiene.
Her er et eksempel ved hjelp av en Serie av strenger s
som har objektet dtype:
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
standard oppførsel er å heve hvis det kan ikke konvertere en verdi., I dette tilfellet, det kan ikke takle strengen ‘pandaer’:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
Snarere enn å mislykkes, kan vi kanskje ‘pandaer» for å bli betraktet som en manglende/dårlig numerisk verdi., Vi kan tvinge ugyldige verdier til NaN
som følger med errors
søkeord argument:
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
Det tredje alternativet for errors
er bare å ignorere drift hvis en ugyldig verdi er oppstått:
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
Dette siste alternativet er spesielt nyttig når du ønsker å konvertere hele DataFrame, men ikke ikke vet hvilke av våre kolonner kan konverteres pålitelig til en numerisk type., I så fall bare skrive:
df.apply(pd.to_numeric, errors='ignore')
funksjonen vil bli brukt til hver kolonne av DataFrame. Kolonner som kan konverteres til en numerisk type vil bli konvertert, mens kolonner som ikke kan (f.eks. de inneholder ikke-sifret strenger eller datoer) vil være alene.
Downcasting
standard konvertering med to_numeric()
vil gi deg enten en int64
eller float64
dtype (eller hvilket som helst heltall bredde er innfødt til din plattform).,
det er Som regel hva du vil, men hva hvis du ønsket å spare minne og bruker en mer kompakt dtype, som float32
, eller int8
?
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Downcasting til «integer’ bruker den minste mulige heltall som kan holde verdier:
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
Downcasting «flyter» på samme måte plukker en mindre enn normalt flytende, skriv:
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
astype()
metoden gjør det mulig å være eksplisitt om dtype du vil at DataFrame eller Serien for å ha., Det er veldig allsidig og du kan prøve og gå fra den ene typen til den andre.
Grunnleggende bruk
Anrop metoden på det objektet du ønsker å konvertere og astype()
vil prøve, og konvertere den for du:
legg Merke til at jeg sa «prøv» – hvis astype()
ikke vet hvordan å konvertere en verdi i Serien eller DataFrame, det vil heve en feil. For eksempel hvis du har en NaN
eller inf
verdi, vil du få en feilmelding som prøver å konvertere det til et heltall.
Som av pandaer 0.20.,0, denne feilen kan undertrykkes ved å sende errors='ignore'
. Den opprinnelige objektet vil være tilbake urørt.
Vær forsiktig
astype()
er kraftig, men vil det noen ganger konvertere verdier «feil». For eksempel:
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Dette er små heltall, så om hvordan å konvertere til en usignert 8-bit-type for å spare minne?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
konverteringen arbeidet, men -7 ble pakket rundt for å bli 249 (dvs. 28 – 7)!
Prøver å nedslått ved hjelp av pd.to_numeric(s, downcast='unsigned')
i stedet kunne bidra til å hindre at denne feilen oppstår.,
infer_objects()
Versjon 0.21.0 av pandaer introduserte metode infer_objects()
for å konvertere kolonner i en DataFrame som har et objekt datatype til en mer spesifikk type (soft konverteringer).
For eksempel, her er en DataFrame med to kolonner av objekt-type. Man har faktisk heltall og den andre holder strengene som representerer heltall:
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
ved Hjelp av infer_objects()
, kan du endre type-kolonnen ‘a’ til int64:
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
Kolonnen ‘b’ har vært alene siden dens verdier ble strenger, ikke heltall., Hvis du ønsker å prøve og tvinge konvertering av begge kolonner til et heltall typen, kan du bruke df.astype(int)
i stedet.
convert_dtypes()
Versjon 1.0 og ovenfor inneholder en metode convert_dtypes()
for å konvertere Serien og DataFrame kolonner for å best mulig dtype som støtter pd.NA
manglende verdi.
Her er «best mulig» betyr den type er mest egnet til å holde verdier., For eksempel, er dette en pandaer heltall type hvis alle verdiene er heltall (eller manglende verdier): et objekt kolonne av Python heltall objekter er konvertert til Int64
, en kolonne av NumPy int32
verdiene vil bli pandaer dtype Int32
.,
Med vår object
DataFrame df
, får vi følgende resultat:
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
Siden kolonnen ‘en’ holdt heltall, det var konvertert til Int64
type (som er i stand til å holde manglende verdier, i motsetning til int64
).
Kolonnen ‘b’ inneholdt string-objekter, så ble endret til pandaer’ string
dtype.
som standard er denne metoden vil antyde den type fra objektet verdier i hver kolonne., Vi kan endre dette ved å sende infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
Nå kolonne ‘en» var et objekt kolonne: pandaer vet det kan bli beskrevet som en «integer» – kolonnen (internt er det løp infer_dtype
), men ikke konkludere akkurat hva dtype av heltall det skulle ha, så fikk du ikke konvertere den. Kolonnen ‘b’ var igjen konvertert til ‘string’ dtype som det ble anerkjent som holder ‘string’ verdier.