web-dev-qa-db-fra.com

Convertir des floats en ints en pandas?

Je travaille avec des données importées d'un fichier CSV. Pandas a modifié certaines colonnes pour qu'elles flottent, donc maintenant les nombres dans ces colonnes sont affichés sous forme de points flottants! Cependant, j'ai besoin qu'ils soient affichés sous forme d'entiers ou sans virgule. Est-il possible de les convertir en nombres entiers ou de ne pas afficher la virgule?

176
MJP

Pour modifier la sortie float, procédez comme suit:

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
184
EdChum

Utilisez la fonction .astype(<type>) pour manipuler les types de colonne.

>>> 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

MODIFIER:

Pour gérer les valeurs manquantes:

>>> 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
>>>
145
Ryan G

À l'aide d'une liste de noms de colonnes, modifiez le type de plusieurs colonnes avec .applymap () ou d'une seule colonne avec .apply ().

    df = pd.DataFrame(10*np.random.Rand(3, 4), columns=list("ABCD"))

              A         B         C         D
    0  8.362940  0.354027  1.916283  6.226750
    1  1.988232  9.003545  9.277504  8.522808
    2  1.141432  4.935593  2.700118  7.739108

    cols = ['A', 'B']
    df[cols] = df[cols].applymap(np.int64)

       A  B         C         D
    0  8  0  1.916283  6.226750
    1  1  9  9.277504  8.522808
    2  1  4  2.700118  7.739108

    df['C'] = df['C'].apply(np.int64)
       A  B  C         D
    0  8  0  1  6.226750
    1  1  9  9  8.522808
    2  1  4  2  7.739108
28
user4322543

C'est une solution rapide si vous souhaitez convertir plus de colonnes de votre Pandas DataFrame df de float en entier, en considérant également le cas où vous pouvez avoir des valeurs NaN.

cols = ['col_1', 'col_2', 'col_3', 'col_4']
for col in cols:
   df[col] = df[col].apply(lambda x: int(x) if x == x else "")

J'ai essayé avec:

 else x)
 else None)

mais le résultat est toujours avoir le nombre float, donc j'ai utilisé else ""

9
enri

En développant l'utilisation de @Ryan G de la fonction .astype(<type>), vous pouvez utiliser l'argument errors=ignore pour convertir uniquement les colonnes qui ne génèrent pas d'erreur, ce qui simplifie considérablement la syntaxe. Évidemment, il convient de faire preuve de prudence lorsque vous ignorez les erreurs, mais cette tâche est très pratique.

df = pd.DataFrame(np.random.Rand(3,4), columns=list("ABCD"))
df *= 10
df

    A       B       C       D
0   2.16861 8.34139 1.83434 6.91706
1   5.85938 9.71712 5.53371 4.26542
2   0.50112 4.06725 1.99795 4.75698

df['E'] = list("XYZ")
df.astype(int, errors='ignore')

    A   B   C   D   E
0   2   8   1   6   X
1   5   9   5   4   Y
2   0   4   1   4   Z

De astype docs:

erreurs: {'lever', 'ignorer'}, 'lever' par défaut

Contrôle de la levée des exceptions sur les données non valides pour le type fourni.

  • raise: permet aux exceptions d'être levées
  • ignore: supprime les exceptions. En cas d'erreur, retourne l'objet original

Nouveauté 0.20.0.

6
aebmad
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
4
user8051244

**

Pour convertir toutes les colonnes float en 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
2
Suhas_Pote

Voici une fonction simple qui descendra dans le type entier le plus petit possible et qui ne perd aucune information. Pour des exemples,

  • 100.0 peut être converti de float en entier, mais 99.9 ne peut pas (sans perdre d'informations en raison de l'arrondissement ou de la troncature)

  • De plus, la valeur 1.0 peut être convertie jusqu'à int8 sans perdre d'informations, mais le plus petit type entier pour 100_000.0 est int32

Exemples de code:

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])
0
JohnE