web-dev-qa-db-fra.com

Supprimer la notation scientifique chez les pandas?

J'ai un DataFrame dans les pandas où certains des nombres sont exprimés en notation scientifique (ou notation d'exposant) comme ceci:

                  id        value
id              1.00    -4.22e-01
value          -0.42     1.00e+00
percent        -0.72     1.00e-01
played          0.03    -4.35e-02
money          -0.22     3.37e-01
other            NaN          NaN
sy             -0.03     2.19e-04
sz             -0.33     3.83e-01

Et la notation scientifique rend ce qui devrait être une comparaison facile, inutilement difficile. Je suppose que c'est la valeur 21900 qui fait foirer les autres. Je veux dire que 1.0 est codé. UN! 

Cela ne marche pas:

np.set_printoptions(supress=True) 

Et pandas.set_printoptions n'implémente pas non plus la suppression, et j'ai tout regardé à pd.describe_options() avec désespoir, et pd.core.format.set_eng_float_format() ne semble l'activer que pour toutes les autres valeurs flottantes, sans possibilité de le désactiver.

25
user1244215

Vos données sont probablement object dtype. Ceci est un copier/coller direct de vos données. read_csv l'interprète comme le bon type. Vous ne devriez normalement avoir que object dtype sur les champs de type chaîne.

In [5]: df = read_csv(StringIO(data),sep='\s+')

In [6]: df
Out[6]: 
           id     value
id       1.00 -0.422000
value   -0.42  1.000000
percent -0.72  0.100000
played   0.03 -0.043500
money   -0.22  0.337000
other     NaN       NaN
sy      -0.03  0.000219
sz      -0.33  0.383000

vérifiez si vos types sont object

In [7]: df.dtypes
Out[7]: 
id       float64
value    float64
dtype: object

Ceci convertit ce cadre en object dtype (notez que l'impression est drôle maintenant)

In [8]: df.astype(object)
Out[8]: 
           id     value
id          1    -0.422
value   -0.42         1
percent -0.72       0.1
played   0.03   -0.0435
money   -0.22     0.337
other     NaN       NaN
sy      -0.03  0.000219
sz      -0.33     0.383

Voici comment le reconvertir (astype(float)) fonctionne également ici

In [9]: df.astype(object).convert_objects()
Out[9]: 
           id     value
id       1.00 -0.422000
value   -0.42  1.000000
percent -0.72  0.100000
played   0.03 -0.043500
money   -0.22  0.337000
other     NaN       NaN
sy      -0.03  0.000219
sz      -0.33  0.383000

Voici à quoi ressemblerait un cadre object dtype

In [10]: df.astype(object).dtypes
Out[10]: 
id       object
value    object
dtype: object
8
Jeff

temporaire rapide: df.round(4) 

global: pd.options.display.float_format = '{:20,.2f}'.format

34
citynorman

Si vous souhaitez utiliser les valeurs comme chaîne formatée dans une liste, par exemple dans le fichier csv csv.writer, vous pouvez formater les nombres avant de créer une liste:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
0
evil242