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?
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
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
>>>
À 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
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 ""
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.
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
**
**
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
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])