python - turn - round float to int pandas




Converter carros alegóricos para ints em pandas? (6)

Eu tenho trabalhado com dados importados de um CSV. Os pandas mudaram algumas colunas para flutuar, então agora os números nessas colunas são exibidos como pontos flutuantes! No entanto, eu preciso que eles sejam exibidos como inteiros, ou, sem vírgula. Existe uma maneira de convertê-los em números inteiros ou não exibir a vírgula?


**

Para converter todas as colunas flutuantes para int

**

df = pd.DataFrame(np.random.rand(5,4) * 10, columns=list("PQRS"))

df
    P           Q           R           S
0   4.395994    0.844292    8.543430    1.933934
1   0.311974    9.519054    6.171577    3.859993
2   2.056797    0.836150    5.270513    3.224497
3   3.919300    8.562298    6.852941    1.415992
4   9.958550    9.013425    8.703142    3.588733


float_col = df.select_dtypes(include = ['float64']) # This will select float columns only
# list(float_col.columns.values)
for col in float_col.columns.values:
    df[col] = df[col].astype('int64')

df

    P   Q   R   S
0   4   0   8   1
1   0   9   6   3
2   2   0   5   3
3   3   8   6   1
4   9   9   8   3

Aqui está uma função simples que vai para baixo e flutua no menor número inteiro possível, mas somente se puder ser feito com segurança (sem perda de precisão numérica). Ou seja, 100 podem ser convertidos de inteiro para float, mas 99.9 não podem.

import numpy as np
import pandas as pd

def float_to_int( s ):
    if ( s.astype(np.int64) == s ).all():
        return pd.to_numeric( s, downcast='integer' )
    else:
        return s

# small integers are downcast into 8-bit integers
float_to_int( np.array([1.0,2.0]) )
Out[1]:array([1, 2], dtype=int8)

# larger integers are downcast into larger integer types
float_to_int( np.array([100_000.,200_000.]) )
Out[2]: array([100000, 200000], dtype=int32)

# if there are values to the right of the decimal
# point, no conversion is made
float_to_int( np.array([1.1,2.2]) )
Out[3]: array([ 1.1,  2.2])

Expandindo o @Ryan G mencionou o uso da função .astype(<type>) , pode-se usar o argumento errors=ignore para converter apenas as colunas que não produzem um erro, o que simplifica notavelmente a sintaxe. Obviamente, deve-se ter cuidado ao ignorar erros, mas para essa tarefa é muito útil.

df = pd.DataFrame(np.random.rand(3,4), columns=list("ABCD"))
df['E'] = list("XYZ")
df.astype(int, errors='ignore')

    A   B   C   D   E
0   0   0   0   0   X
1   0   0   0   0   Y
2   0   0   0   0   Z

De astype docs:

erros: {'raise', 'ignore'}, padrão 'raise'

Controlar o aumento de exceções em dados inválidos para o dtype fornecido.

  • raise: permitir que exceções sejam levantadas
  • ignore: suprime exceções. No erro retornar objeto original

Novo na versão 0.20.0.


Para modificar a saída flutuante, faça o seguinte:

df= pd.DataFrame(range(5), columns=['a'])
df.a = df.a.astype(float)
df

Out[33]:

          a
0 0.0000000
1 1.0000000
2 2.0000000
3 3.0000000
4 4.0000000

pd.options.display.float_format = '{:,.0f}'.format
df

Out[35]:

   a
0  0
1  1
2  2
3  3
4  4

Use a função astype() para manipular os tipos de coluna.

>>> df = pd.DataFrame(np.random.rand(3,4), columns=list("ABCD"))
>>> df
          A         B         C         D
0  0.542447  0.949988  0.669239  0.879887
1  0.068542  0.757775  0.891903  0.384542
2  0.021274  0.587504  0.180426  0.574300
>>> df[list("ABCD")] = df[list("ABCD")].astype(int)
>>> df
   A  B  C  D
0  0  0  0  0
1  0  0  0  0
2  0  0  0  0

EDITAR:

Para lidar com valores ausentes:

>>> df
          A         B     C         D
0  0.475103  0.355453  0.66  0.869336
1  0.260395  0.200287   NaN  0.617024
2  0.517692  0.735613  0.18  0.657106
>>> df[list("ABCD")] = df[list("ABCD")].fillna(0.0).astype(int)
>>> df
   A  B  C  D
0  0  0  0  0
1  0  0  0  0
2  0  0  0  0
>>>

import pandas as pd;
right = pd.DataFrame({'C': [1.002, 2.003],
               'D': [1.009, 4.55],
                "key":['K0', 'K1']})


           C    D   key
0   1.002   1.009   K0
1   2.003   4.550   K1

right['C'] = right.C.astype(int)

       C    D   key
0   1   1.009   K0
1   2   4.550   K1




dataset