Endre kolonne type i pandaer

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *