Skift kolonnetype i pandaer

du har fire hovedmuligheder for konvertering af typer i pandaer:

læs videre for mere detaljerede forklaringer og brug af hver af disse metoder.

den bedste måde at konvertere en eller flere kolonner af en DataFrame til numeriske værdier er at bruge pandas.to_numeric().

denne funktion vil forsøge at ændre ikke-numeriske objekter (såsom strenge) til heltal eller flydende punktnumre efter behov.

grundlæggende brug

indgangen tilto_numeric() er en serie eller en enkelt kolonne i en DataFrame.,

som du kan se, returneres en ny serie. Husk at tildele dette output til en variabel eller kolonne navn til at fortsætte med at bruge det:

# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)

Du kan også bruge det til at konvertere flere kolonner i en DataFrame via apply() metode:

Så længe dine værdier kan alle blive konverteret, der sandsynligvis er alt hvad du har brug for.

fejlhåndtering

men hvad nu hvis nogle værdier ikke kan konverteres til en numerisk type?,

to_numeric() også tager en errors søgeord argument, der giver dig mulighed for at tvinge ikke-numeriske værdier NaN, eller blot ignorere kolonner, der indeholder disse værdier.

Her er et eksempel ved hjælp af en Række strenge s, der har til formål dtype:

>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object

standard opførsel er at raise, hvis det kan ikke konvertere en værdi., I dette tilfælde kan det ikke klare strengen ‘pandas’:

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string

snarere end at mislykkes, vil vi måske have, at ‘pandas’ betragtes som en manglende/dårlig numerisk værdi., Vi kan tvinge ugyldige værdier NaN som følger ved brug af errors søgeord argument:

>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64

Den tredje mulighed for errors er bare at ignorere den operation, hvis en ugyldig værdi er stødt på:

>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched

Denne sidste mulighed er især nyttig, når du ønsker at konvertere hele din DataFrame, men ikke ved, hvilke af vores kolonner kan konverteres pålideligt til en numerisk type., I så fald skal du bare skrive:

df.apply(pd.to_numeric, errors='ignore')

funktionen vil blive anvendt på hver kolonne i Dataframmen. Kolonner, der kan konverteres til en numerisk type, konverteres, mens kolonner, der ikke kan (f.eks.

Downcasting

Som standard, konvertering med to_numeric() vil give dig enten en int64 eller float64 dtype (eller hvad heltal bredde er indfødte til din platform).,

Det er normalt, hvad du vil, men hvad hvis du ønsker at spare nogle hukommelsen og bruge en mere kompakt dtype, som f.eks. float32, eller int8?

>>> s = pd.Series()>>> s0 11 22 -7dtype: int64

Downcasting at ‘heltal’ bruger den mindste heltal, der kan holde værdierne:

>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8

Downcasting at “float” på samme måde opfanger et mindre end normalt flydende type:

>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32

astype()

astype() metode gør det muligt for dig at være eksplicitte omkring de dtype du ønsker, at din DataFrame eller Serie til at have., Det er meget alsidigt, idet du kan prøve at gå fra den ene type til den anden.

Grundlæggende brug

Kalder metoden på det objekt, du vil konvertere fra, og astype() vil forsøge at konvertere det til dig:

Bemærk, at jeg sagde “prøv at” – hvis astype() ikke kender hvordan til at konvertere en værdi i Serien eller DataFrame, vil det udløse en fejl. For eksempel hvis du har en NaN eller inf værdi, får du en fejl ved at prøve at konvertere den til et heltal.

fra pandas 0.20.,0, kan denne fejl undertrykkes ved at passere errors='ignore'. Din oprindelige objekt vil være tilbage uberørt.

vær forsigtig

astype() er kraftig, men det vil undertiden konvertere værdier “forkert”. For eksempel:

>>> s = pd.Series()>>> s0 11 22 -7dtype: int64

disse er små heltal, så hvad med at konvertere til en usigneret 8-bit type for at gemme hukommelse?

>>> s.astype(np.uint8)0 11 22 249dtype: uint8

konverteringen fungerede, men -7 blev pakket rundt til 249 (dvs. 28 – 7)!

forsøger at do .ncast ved hjælp afpd.to_numeric(s, downcast='unsigned') i stedet kan hjælpe med at forhindre denne fejl.,

infer_objects()

Version 0.21.0 af pandaer indført metoden infer_objects() til konvertering af kolonner i en DataFrame, der har et object datatype til en mere specifik type (bløde konverteringer).

for eksempel er her en DataFrame med to kolonner af objekttype. Man holder faktiske heltal, og den anden holder strenge, der repræsenterer hele tal:

>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object

ved Brug af infer_objects(), kan du ændre den type kolonne, ‘a’ til int64:

>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object

Kolonne “b”, der er blevet alene tilbage, da dens værdier var strenge, ikke heltal., Hvis du ville forsøge at tvinge konverteringen af begge kolonner til en heltalstype, kunne du bruge df.astype(int) i stedet.

convert_dtypes()

Version 1.0 og frem indeholder en metode convert_dtypes() for at konvertere Serie og DataFrame kolonner til den bedst mulige dtype, der understøtter pd.NA manglende værdi.

Her betyder “bedst mulig” den type, der er bedst egnet til at holde værdierne., For eksempel, er dette en pandaer integer type, hvis alle værdier er heltal (eller manglende værdier): et objekt i kolonne af Python heltal til objekter, bliver konverteret til Int64, en kolonne af NumPy int32 værdier vil blive pandas dtype Int32.,

Med vores object DataFrame df, får vi følgende resultat:

>>> df.convert_dtypes().dtypes a Int64b stringdtype: object

Siden kolonne ‘en”, der blev afholdt integer værdier, der var konverteret til Int64 type (som er i stand til at holde manglende værdier, i modsætning int64).

kolonne ‘B’ indeholdt strengobjekter, så blev ændret til pandas’string dtype.

som standard vil denne metode udlede typen fra objektværdier i hver kolonne., Vi kan ændre dette ved at passere infer_objects=False:

>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object

Nu kolonne ” a ” forblev et objekt kolonne: pandas ved, at det kan beskrives som en ‘heltal’ kolonne (internt det løb infer_dtype), men ikke udlede præcis, hvad dtype af heltal det skal have, så ikke konvertere den. Kolonne ‘ b ‘blev igen konverteret til’ string ‘dtype, da det blev anerkendt som holding’ string ‘ værdier.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *