aveți Patru opțiuni principale pentru Conversia tipurilor în Panda:
citiți mai departe pentru explicații mai detaliate și utilizarea fiecăreia dintre aceste metode.
Cel mai bun mod de a converti unul sau mai multe coloane ale unui DataFrame pentru valori numerice este de a utiliza pandas.to_numeric()
.
această funcție va încerca să schimbe obiecte non-numerice (cum ar fi șiruri de caractere) în numere întregi sau numere în virgulă mobilă, după caz.
utilizare de Bază
intrarea la to_numeric()
este o Serie sau o singură coloană de DataFrame.,după cum puteți vedea, o nouă serie este returnată. Amintiți-vă pentru a atribui această ieșire a unei variabile sau nume de coloană pentru a continua folosind-o:
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
de asemenea, puteți folosi pentru a converti mai multe coloane ale unui DataFrame prin apply()
metoda:
atâta timp Cât valorile pot fi convertite, asta e, probabil, tot ce ai nevoie.
eroare de manipulare
dar ce se întâmplă dacă unele valori nu pot fi convertite într-un tip numeric?,
to_numeric()
ia, de asemenea, un errors
cuvinte cheie argument care vă permite pentru a forța non-valori numerice să fie NaN
, sau pur și simplu ignora coloane care conțin aceste valori.
Aici e un exemplu, folosind o Serie de siruri de caractere s
care are ca obiect dtype:
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
comportamentul implicit este de a ridica dacă nu se poate converti o valoare., În acest caz, nu poate face față șirului”Panda”:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
Mai degrabă decât să eșueze, am putea dori ca „panda” să fie considerată o valoare numerică lipsă/proastă., Putem constrânge invalid valori NaN
după cum urmează, utilizând errors
cuvinte cheie argument:
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
Cea de-a treia opțiune pentru errors
este doar pentru a ignora funcționare dacă o valoare nevalidă este întâlnită:
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
Această ultimă opțiune este deosebit de util atunci când doriți pentru a converti întreaga DataFrame, dar nu știu care dintre coloane poate fi transformat în mod fiabil la un tip numeric., În acest caz, scrieți:
df.apply(pd.to_numeric, errors='ignore')
funcția va fi aplicată fiecărei coloane a cadrului de date. Coloanele care pot fi convertite într-un tip numeric vor fi convertite, în timp ce coloanele care nu pot (de exemplu, conțin șiruri sau date non-cifre) vor fi lăsate singure.
Downcasting
în mod implicit, de conversie cu to_numeric()
va oferi fie un int64
sau float64
dtype (sau orice număr întreg lățime este nativ pentru platforma).,
de obicei Asta e ceea ce vrei, dar ce se întâmplă dacă ai vrut pentru a salva unele de memorie și de a folosi-o mult mai compact dtype, ca float32
sau int8
?
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Downcasting pentru „întreg” folosește cel mai mic număr întreg care poate deține valori:
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
Downcasting pentru a „float” în mod similar alege un mai mic decât în mod normal plutitoare tip:
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
astype()
metodă vă permite să fie explicit despre dtype vrei DataFrame sau Serie pentru a avea., Este foarte versatil în care puteți încerca și du-te la un tip la oricare alta.
utilizare de Bază
Apela metoda pe obiectul pe care doriți să convertiți și să astype()
va încerca și de a converti pentru tine:
Observați că am spus „incearca” – dacă astype()
nu știu cum de a converti o valoare în Serie sau DataFrame, se va ridica o eroare. De exemplu, dacă aveți o valoare NaN
sau inf
veți primi o eroare încercând să o convertiți într-un număr întreg.
ca de panda 0.20.,0, această eroare poate fi suprimată prin trecerea errors='ignore'
. Obiectul original va fi întoarce neatins.
fii atent
astype()
este puternic, dar uneori va converti valorile”incorect”. De exemplu:
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
acestea sunt numere întregi mici, deci ce zici de conversia la un tip nesemnat pe 8 biți pentru a salva memoria?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
conversia a funcționat, dar -7 a fost înfășurat rotund pentru a deveni 249 (adică 28 – 7)!
încercarea de a reduce utilizarea pd.to_numeric(s, downcast='unsigned')
în schimb ar putea ajuta la prevenirea acestei erori.,
infer_objects()
Versiunea 0.21.0 de panda a introdus metoda infer_objects()
pentru conversia coloane de o DataFrame care au un obiect de tip pentru un tip mai specific (moale conversii).
de exemplu, aici este un cadru de date cu două coloane de tip obiect. Unul deține reale numere întregi și alte deține siruri de caractere care reprezintă numere întregi:
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
cu Ajutorul infer_objects()
, puteți schimba tipul de coloana ” a ” pentru a int64:
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
Coloana ” b ” a fost lăsat în pace, deoarece valorile sale au fost siruri de caractere, nu de numere întregi., Dacă doriți să încercați să forțați conversia ambelor coloane la un tip întreg, puteți utiliza df.astype(int)
în schimb.
convert_dtypes()
Versiunea 1.0 și mai sus include o metodă convert_dtypes()
pentru a converti Serie și DataFrame coloane la cele mai bune posibil dtype care acceptă pd.NA
lipsa de valoare.
aici „cel mai bun posibil” înseamnă tipul cel mai potrivit pentru păstrarea valorilor., De exemplu, aceasta este o panda tip întreg dacă toate valorile sunt numere întregi (sau valori lipsă): un obiect coloana de Python număr întreg de obiecte este convertit la Int64
, o coloană de NumPy int32
valori vor deveni panda dtype Int32
.,
Cu object
DataFrame df
, vom obține următorul rezultat:
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
Din coloana ” a ” a avut loc valori întregi, a fost convertit la Int64
tip (care este capabil de a deține valori lipsă, spre deosebire de int64
).
coloana ” b „conținea obiecte string, astfel încât a fost schimbat la panda” string
dtype.
în mod implicit, această metodă va deduce tipul din valorile obiectului din fiecare coloană., Putem schimba acest lucru prin trecerea infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
Acum coloana ” a „a rămas un obiect de coloană: panda știe acesta poate fi descris ca un „întreg” coloana (pe plan intern a fugit infer_dtype
) dar nu deduce exact ce dtype de întreg ar trebui să aibă așa că nu-l convertească. Coloana ” b „a fost din nou convertită în dtype „string”, deoarece a fost recunoscută ca deținând valori „string”.