Hai quattro opzioni principali per convertire i tipi in panda:
Continua a leggere per spiegazioni più dettagliate e l’utilizzo di ciascuno di questi metodi.
Il modo migliore per convertire una o più colonne di un DataFrame in valori numerici è usare pandas.to_numeric()
.
Questa funzione tenterà di modificare oggetti non numerici (come le stringhe) in numeri interi o numeri in virgola mobile a seconda dei casi.
Utilizzo di base
L’input ato_numeric()
è una serie o una singola colonna di un DataFrame.,
Come puoi vedere, viene restituita una nuova Serie. Ricorda di assegnare questo output a una variabile o al nome di una colonna per continuare ad usarlo:
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
Puoi anche usarlo per convertire più colonne di un DataFrame tramite ilapply()
metodo:
Finché i tuoi valori possono essere convertiti, probabilmente è tutto ciò di cui hai bisogno.
Gestione degli errori
Ma cosa succede se alcuni valori non possono essere convertiti in un tipo numerico?,
to_numeric()
accetta anche unerrors
argomento della parola chiave che consente di forzare i valori non numerici per essere NaN
, o semplicemente ignorare le colonne contenenti questi valori.
Ecco un esempio utilizzando una serie di stringhes
che ha l’oggetto dtype:
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
Il comportamento predefinito è quello di aumentare se non è possibile convertire un valore., In questo caso, non può far fronte alla stringa ‘panda’:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
Piuttosto che fallire, potremmo volere che ‘panda’ sia considerato un valore numerico mancante / cattivo., Siamo in grado di costringere i valori non validi NaN
come segue utilizzando il errors
parola chiave argomento:
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
La terza opzione per errors
è solo per ignorare l’operazione se un valore non valido è stato rilevato:
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
Quest’ultima opzione è particolarmente utile quando si desidera convertire il vostro intero DataFrame, ma non so quale dei nostri colonne possono essere convertiti in modo affidabile ad un tipo numerico., In tal caso basta scrivere:
df.apply(pd.to_numeric, errors='ignore')
La funzione verrà applicata a ciascuna colonna del DataFrame. Le colonne che possono essere convertite in un tipo numerico verranno convertite, mentre le colonne che non possono (ad esempio contengono stringhe o date non numeriche) verranno lasciate sole.
Downcasting
Per impostazione predefinita, la conversione conto_numeric()
ti darà unint64
ofloat64
dtype (o qualsiasi larghezza intera sia nativa della tua piattaforma).,
Di solito è quello che vuoi, ma cosa succede se vuoi salvare un po ‘ di memoria e usare un dtype più compatto, come float32
, o int8
?
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
il Downcast per ‘integer’, utilizza il minor numero intero che può contenere i valori:
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
il Downcast “flottante” allo stesso modo sceglie il più piccolo del normale galleggiante tipo:
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
astype()
metodo consente di essere esplicito circa il tipo dimensione che si desidera che il DataFrame o Serie a hanno., È molto versatile in quanto puoi provare e passare da un tipo all’altro.
Uso di base
Chiama il metodo sull’oggetto che vuoi convertire eastype()
proverà a convertirlo per te:
Avviso Ho detto “prova” – seastype()
non sa come convertire un valore nella Serie o nel DataFrame, genererà un errore. Ad esempio, se si dispone di un valore NaN
o inf
si otterrà un errore nel tentativo di convertirlo in un numero intero.
A partire da panda 0.20.,0, questo errore può essere soppresso passando errors='ignore'
. Il tuo oggetto originale sarà restituito intatto.
Fai attenzione
astype()
è potente, ma a volte converte i valori “in modo errato”. Ad esempio:
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Questi sono piccoli numeri interi, quindi che ne dici di convertire in un tipo a 8 bit senza segno per risparmiare memoria?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
La conversione ha funzionato, ma il -7 è stato avvolto per diventare 249 (cioè 28 – 7)!
Provare a eseguire il downcast utilizzandopd.to_numeric(s, downcast='unsigned')
potrebbe invece aiutare a prevenire questo errore.,
infer_objects ()
La versione 0.21.0 di panda ha introdotto il metodoinfer_objects()
per convertire le colonne di un DataFrame con un tipo di oggetto in un tipo più specifico (conversioni soft).
Ad esempio, ecco un DataFrame con due colonne di tipo oggetto. Uno contiene interi effettivi e l’altro contiene stringhe che rappresentano interi:
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
Usando infer_objects()
, puoi cambiare il tipo di colonna ‘a’ in int64:
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
La colonna ‘b’ è stata lasciata sola poiché i suoi valori erano stringhe, non interi., Se si desidera provare a forzare la conversione di entrambe le colonne in un tipo intero, è possibile utilizzare df.astype(int)
.
convert_dtypes ()
La versione 1.0 e successiva include un metodoconvert_dtypes()
per convertire le colonne di serie e DataFrame nel miglior dtype possibile che supporti ilpd.NA
valore mancante.
Qui “migliore possibile” indica il tipo più adatto per contenere i valori., Ad esempio, questo è un tipo intero panda se tutti i valori sono interi (o valori mancanti): una colonna oggetto di oggetti interi Python viene convertita in Int64
, una colonna di NumPy int32
i valori diventeranno il panda dtype Int32
.,
Con il nostro object
DataFrame df
, otteniamo il seguente risultato:
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
Poiché la colonna ‘a’ conteneva valori interi, è stata convertita nel Int64
type (che è in grado di contenere valori mancanti, a differenza di int64
).
Colonna ‘b’ conteneva oggetti string, così è stato cambiato in panda’string
dtype.
Per impostazione predefinita, questo metodo dedurrà il tipo dai valori dell’oggetto in ogni colonna., Siamo in grado di cambiare questo, passando infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
Ora la colonna ‘a’ rimasta una colonna oggetto: panda sa che può essere descritto come un ‘integer’ colonna (internamente correva infer_dtype
), ma non dedurre esattamente che tipo dimensione dell’intero dovrebbe avere in modo da non convertire. La colonna ‘ b ‘è stata nuovamente convertita in dtype’ string ‘poiché è stata riconosciuta come contenente valori’ string’.