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