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.