2016-05-04 3 views
2

Der folgende Code erzeugt unterschiedliche Ergebnisse in Python 2.7.5.final.0 mit Pandas 0.15.1 und numpy 1.9.1 und in Python 2.7.11. final.0 mit Pandas 0.18.0 und numpy 1.10.4 (das Anaconda-Paket).So stellen Sie sicher, dass sich das Verhalten von pandas.to_csv() nicht ändert

Die frühere Version gibt das Ergebnis 18292498239.8; letzteres, 18292498239.824.

import numpy as np 
import pandas as pd 
x = 18292498239.824 
df = pd.DataFrame({'One': x},index=["bignum"]) 
df.to_csv('junktest.txt') 
fh = open('junktest.txt','rb') 
res = fh.read().split('\n')[1].split(',')[1] 
print "Result:",res 

Aber wenn wir x auf 292498239.824 setzen, bekommen wir das gleiche Ergebnis von beiden: 292498239.824. Wenn wir eine Größenordnung hochgehen (x = 118292498239.824), sind die Ergebnisse 1.1829249824e+11 und 118292498239.824.

Es sieht so aus als ob die neuere Version von pandas.DataFrame.to_csv() Floats auf 12 Ziffern beschränkt, aber ich kann nichts in der Pandas-Dokumentation finden, um zu sagen, wann die Änderung aufgetreten ist - oder warum.

Dies führte dazu, dass einige der Komponententests beim Upgrade auf Anaconda fehlschlagen. Ich würde gerne ein Upgrade durchführen können, ohne meine Tests wesentlich zu überarbeiten.

Antwort

2

UPDATE2:

können Sie versuchen, np.set_printoptions(precision=20) Funktion zu verwenden:

np.set_printoptions(precision=20) 
df.to_csv('d:/temp/a.csv', index=False) 

gibt mir

d: /temp/a.csv:

One 
18292498239.824 
123456789.12 

HINWEIS : mit Pandas 0.18.1

DF:

In [25]: df 
Out[25]: 
      One 
0 1.829250e+10 
1 1.234568e+14 

ALTE Antwort:

Verwendung float_format='%16.4f' Parameter im to_csv() Aufruf

Docs:

float_format: string, default Keine

Format-String für Gleitkommazahlen

+0

Danke, aber das funktioniert nicht. Nicht alle Spalten benötigen drei Dezimalstellen und ich möchte keine abschließenden Nullen - es sei denn, es gibt eine Möglichkeit, unterschiedliche float_formats in verschiedenen Spalten zu haben. Ich sah, aber sah keine solche .... –

+0

es sieht aus wie astype (str) hat auch eine 12-Zeichen-Grenze. Ich möchte die erste Nummer in CSV als 18292498239.824 gespeichert werden. Das war das frühere Verhalten. –

+2

Das Problem ist nicht, dass 'to_csv()' geändert wurde, sondern dass 'csv.writer' geändert wurde. Versuchen zu finden, wann und wie diese Änderung vorgenommen wurde, fand ich dies: http://bugs.python.org/issue13573. Also, im Dezember 2011 wurde 'csv.writer' geändert, um' __repr__' anstelle von '__str__' für Floats zu verwenden. Dann, irgendwann vor Februar 2016, wurde es wieder geändert, um '__str__' statt' __repr__' zu verwenden und die Dokumentation wurde geändert, um dies im Februar 2016 widerzuspiegeln. Oder vielleicht die Notiz über Bugs.python.org ist inkorrekt .... –