web-dev-qa-db-de.com

Wissenschaftliche Notation in Pandas unterdrücken?

Ich habe einen DataFrame in Pandas, bei dem einige Zahlen in wissenschaftlicher Notation (oder Exponenten-Notation) wie folgt ausgedrückt werden:

                  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

Und die wissenschaftliche Notation macht einen einfachen Vergleich unnötig schwierig. Ich gehe davon aus, dass es der Wert 21900 ist, der es für die anderen vermasselt. Ich meine 1.0 ist verschlüsselt. EIN! 

Das funktioniert nicht:

np.set_printoptions(supress=True) 

Und pandas.set_printoptions implementiert auch keine Unterdrückung, und ich habe pd.describe_options() verzweifelt betrachtet. pd.core.format.set_eng_float_format() scheint es nur für alle anderen Float-Werte zu aktivieren, ohne die Möglichkeit, es auszuschalten.

25
user1244215

Ihre Daten sind wahrscheinlich object dtype. Dies ist eine direkte Kopie/Einfügung Ihrer Daten. read_csv interpretiert es als den richtigen dtype. Normalerweise sollten Sie object dtype nur für strangeartige Felder verwenden.

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

prüfen Sie, ob Ihre Datentypen object sind.

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

Dies konvertiert diesen Frame in object dtype (der Druck ist jetzt lustig)

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

So kann man es auch zurück konvertieren (astype(float))

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

So würde ein object dtype-Frame aussehen

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

schnell temporär: df.round(4) 

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

34
citynorman

Wenn Sie die Werte als formatierten String in einer Liste verwenden möchten, beispielsweise als Teil der csv-Datei csv.writer, können die Zahlen vor dem Erstellen einer Liste formatiert werden:

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