you have four main options for converting types in pandas:
Read on for more detailed explanations and usage of each of these methods.
A melhor maneira de converter uma ou mais colunas de uma DataFrame para valores numéricos é usar pandas.to_numeric()
.
Esta função irá tentar mudar objectos não-numéricos (como cadeias de caracteres) para números inteiros ou de vírgula flutuante, conforme apropriado.
uso básico
a entrada para to_numeric()
é uma série ou uma única coluna de um DataFrame.,
Como pode ver, uma nova série é devolvida. Lembre-se atribuir este resultado a uma variável ou coluna nome para continuar usando-o:
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
Você também pode usá-lo para converter várias colunas de uma DataFrame através de apply()
método:
desde que os seus valores podem ser convertidos, que provavelmente é tudo o que você precisa.
tratamento de erros
mas e se alguns valores não puderem ser convertidos para um tipo numérico?,
to_numeric()
também leva um errors
palavras-chave argumento que permite forçar valores não-numéricos para ser NaN
, ou simplesmente ignorar colunas contendo esses valores.
aqui está um exemplo usando uma série de strings s
que tem o objeto dtype:
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
o comportamento padrão é aumentar se ele não pode converter um valor., Neste caso, ele não pode lidar com a cadeia ‘pandas’:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
ao invés de falhar, nós podemos querer ‘pandas’ para ser considerado um valor numérico faltante/ruim., Podemos utilizar valores inválidos para NaN
da seguinte forma usando o errors
argumento de palavra-chave:
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
a terceira opção para A errors
é apenas para ignorar a operação se um valor inválido for encontrado:
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
Esta última opção é particularmente útil quando você deseja converter toda sua DataFrame, mas não sabe qual das nossas colunas podem ser convertidos de forma confiável para um tipo numérico., Nesse caso, basta escrever:
df.apply(pd.to_numeric, errors='ignore')
a função será aplicada a cada coluna do DataFrame. As colunas que podem ser convertidas para um tipo numérico serão convertidas, enquanto as colunas que não podem (por exemplo, elas contêm strings ou datas não-digitalizadas) serão deixadas sozinhas.
Downcasting
Por padrão, a conversão com to_numeric()
vai dar-lhe um int64
ou float64
dtype (ou qualquer número inteiro largura é nativo para a plataforma).,
normalmente é o que você quer, mas e se você quiser salvar alguma memória e usar um dtype mais compacto, como float32
, ou int8
?
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Downcasting ‘inteiro’ utiliza o menor número inteiro que pode conter os valores:
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
Downcasting a ‘flutuar’ da mesma forma picaretas menor do que o normal tipo de flutuação:
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
astype()
método permite que você seja explícito sobre o dtype você deseja que sua DataFrame ou Série a ter., É muito versátil em que você pode tentar e ir de um tipo para o outro.
uso Básico
Chamar o método no objeto que você deseja converter e astype()
vou tentar convertê-lo para você:
Repare que eu disse “tentar” – se astype()
não sabe como converter um valor em Série ou DataFrame, ele irá gerar um erro. Por exemplo, se tiver um valor
ouinf
irá obter um erro ao tentar convertê-lo para um inteiro.
em pandas 0.20.,0, this error can be suppressed by passing errors='ignore'
. O seu objecto original voltará intacto.
tenha cuidado
astype()
é poderoso, mas às vezes irá converter valores”incorretamente”. Por exemplo:
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
estes são inteiros pequenos, então que tal converter para um tipo de 8 bits sem sinal para salvar a memória?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
a conversão funcionou, mas o -7 foi enrolado para se tornar 249 (ou seja, 28 – 7)!
tentar rebaixar usando pd.to_numeric(s, downcast='unsigned')
em vez disso poderia ajudar a prevenir este erro.,
infer_objects ()
Version 0.21.0 of pandas introduced the methodinfer_objects()
for converting columns of a DataFrame that have an object datatype to a more specific type (soft conversions).
por exemplo, aqui está um DataFrame com duas colunas de tipo de objeto. Um titular de reais, inteiros e o outro contém cadeias de caracteres que representam números inteiros:
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
Usando a tag infer_objects()
, você pode alterar o tipo de coluna ‘a’ para int64:
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
a Coluna ‘b’ foi deixado sozinho, pois seus valores foram cadeias, não inteiros., Se quiser tentar forçar a conversão de ambas as colunas para um tipo inteiro, poderá usar df.astype(int)
em alternativa.
convert_dtypes()
a Versão 1.0 e acima inclui um método convert_dtypes()
converter-se em Série e em DataFrame colunas da melhor forma possível, dtype que suporta o pd.NA
valor em falta.
aqui “o melhor possível” significa o tipo mais adequado para manter os valores., Por exemplo, este é um pandas tipo inteiro se todos os valores são números inteiros (ou valores em falta): uma coluna de objeto do Python inteiro objetos é convertido para Int64
, uma coluna de NumPy int32
valores vão se tornar os pandas dtype Int32
.,
Com os nossos object
DataFrame df
, obtemos o seguinte resultado:
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
Desde a coluna ‘a’, realizada valores de número inteiro, ele foi convertido para o Int64
tipo (que é capaz de manter os valores em falta, ao contrário de int64
).
Column ‘ B ‘contained string objects, so was changed to pandas’ string
dtype.
Por padrão, este método irá inferir o tipo a partir dos valores dos objetos em cada coluna., Nós podemos mudar isso passando infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
Agora, a coluna ‘um’ manteve-se uma coluna de objeto: os pandas sabe que ele pode ser descrito como um ‘inteiro’ coluna (internamente ele executou infer_dtype
), mas não inferir exatamente o que dtype de número inteiro que deve ter para não convertê-lo. A coluna ” b “foi novamente convertida para “string” dtype, uma vez que foi reconhecida como segurando os valores “string”.