2016-03-29 7 views
0

Ich habe ein Python-Skript geschrieben, das eine oder mehrere CSV-Dateien lädt, verkettet und das Ganze in eine einzige neue CSV-Datei schreibt. Ich habe bemerkt, dass bestimmte Werte während dieser Operation geändert werden, wobei sie durch sehr kleine Werte leicht erhöht/verringert werden. Als Beispiel:Python Pandas ändert Werte in Fließkomma

Original-CSV:

Index SomeValue 
0.000000 0.000 
1.000000 0.000 
2.000000 0.000 
3.000000 0.000 
4.000000 2.527 
5.000000 0.000 

Gespeichert CSV:

Index SomeValue 
0.0 0.0 
1.0 0.0 
2.0 0.0 
3.0 0.0 
4.0 2.5269999999999997 
5.0 0.0 

Das sieht wie ein Full-Scale-Fehler zu mir, aber ich weiß nicht, was es bewirkt. Die Pandas Kern meiner Schrift, die in einer Schleife genannt wird, ist:

l_tmpCsv_st = pd.read_csv(l_listElement_tc, sep='\t', index_col=0) 
l_listOfCsvFiles_tst.append(l_tmpCsv_st) 
# Fills in nan cells with the value "missing" to distinguish betweens a true nan and a missing value due to lacking padding 
l_listOfCsvFiles_tst[-1] = l_listOfCsvFiles_tst[-1].fillna(value='missing') 

# Concatenating csv file with previous ones 
csvFusion = pd.concat([csvFusion, l_listOfCsvFiles_tst[-1]], axis=1) 

Und nach der Schleife:

# Padding missing values of lower frequency files 
csvFusion = csvFusion.fillna(method='pad') 
# Determinating which columns need to be deleted (all "Unnamed" columns are panda-error results and need to be removed) 
l_listColumnsToDelete_tst = [col for col in csvFusion.columns if 'Unnamed' in col] 
# Dropping these columns 
csvFusion.drop(l_listColumnsToDelete_tst, axis=1, inplace=True) 
# Writing full stuff to file 
csvFusion.to_csv(l_endFile_tc, sep='\t', decimal=',', na_rep='-') 

Der Rest meiner Skript ist in keinem Zusammenhang mit Pandas und würde nur die Lesbarkeit schaden, also habe ich es von meinem Kopieren/Einfügen entfernt.

Wie kann ich dieses Problem vermeiden?

Vielen Dank im Voraus,

Ausgabe:

Es war in der Tat ein Floating-Point-Fehler. Abgerundet jeden Wert auf eine ausreichende hohe Stellen löste es:

for col in csvFusion.columns: 
    csvFusion[col] = csvFusion[col].round(15) 
+0

Gibt es eine Fehlermeldung? –

+0

ist es wahrscheinlich mit Float-Präzision zu tun, so dass die gespeicherte Genauigkeit größer ist als die Anzeigegenauigkeit. – EdChum

+0

Das sieht total wie Gleitkommapräzision aus. Sie wissen, dass in einem Commuter nicht alle Zahlen genau, richtig geschrieben werden können? –

Antwort

0

Ich glaube, Sie Parameter müssen float_format in to_csv, weil Fließkomma precission:

print df.to_csv(float_format='%.3f') 
Index,SomeValue 
0.000,0.000 
1.000,0.000 
2.000,0.000 
3.000,0.000 
4.000,2.527 
5.000,0.000 

Ich denke, können Sie verwenden round:

df['SomeValue'] = df['SomeValue'].round(3) 
+0

Aber Drucken wird nicht ändern die Tatsache, dass die Zahl wahrscheinlich ist die in Hos Antwort Antwort, nicht diese –

+0

Ich speichere mehrere Werte verschiedener Größen. Ich habe ein Beispiel mit nur drei Ziffern angegeben, aber einige Werte können eine höhere Genauigkeit haben, und ich mag die Idee nicht, jede Zahl in% .15f zu speichern, da sie meine Enddatei aufblähen würde. – Domack

+0

Ja, verstehe. Mögliche Verwendung ['rund'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.round.html), z. 'df ['SomeValue'] = df ['SomeValue']. ​​Runde (3)'? – jezrael