Change column type in Panda

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 NaNsau 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”.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *