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)
Gibt es eine Fehlermeldung? –
ist es wahrscheinlich mit Float-Präzision zu tun, so dass die gespeicherte Genauigkeit größer ist als die Anzeigegenauigkeit. – EdChum
Das sieht total wie Gleitkommapräzision aus. Sie wissen, dass in einem Commuter nicht alle Zahlen genau, richtig geschrieben werden können? –