2016-07-12 13 views
4

So habe ich eine Excel-Datei, diePython und Importieren von Gleitkommazahlen aus der Excel-Datei

Name R s l2 max_amplitude ref_amplitude 
    R_0.3_s_0.5_l2_0.1 0.3 0.5 0.1 1.45131445 1.45131445 
    R_0.3_s_0.5_l2_0.6 0.3 0.5 0.6 3.52145743 3.52145743 
    ... 
    R_1.1_s_2.0_l2_1.6 1.1 2.0 1.6 5.07415199 5.07415199 
    R_1.1_s_2.0_l2_2.1 1.1 2.0 2.1 5.78820419 5.78820419 
    R_1.1_s_2.0_l2_2.6 1.1 2.0 2.6 5.84488964 5.84488964 
    R_1.1_s_2.0_l2_3.1 1.1 2.0 3.1 6.35387516 6.35387516 

Verwendung des Pandas Modul sieht wie folgt aus ich die Daten in Datenrahmen importieren

import pandas as pd 
df = pd.read_excel("output_var.xlsx", header=0) 

Alles scheint in Ordnung zu sein:

df 

in der Befehlszeile erzeugt:

 R s l2 max_amplitude ref_amplitude 
0 0.3 0.5 0.1  1.451314  1.451314 
1 0.3 0.5 0.6  3.521457  3.521457 
2 0.3 0.5 1.1  4.770226  4.770226 
... 
207 1.1 2.0 2.1  5.788204  5.788204 
208 1.1 2.0 2.6  5.844890  5.844890 
209 1.1 2.0 3.1  6.353875  6.353875 

[210 rows x 5 columns] 

Jetzt muss ich einige Berechnungen basierend auf dem Wert von R tun, damit ich das Array schneiden muss. Spalte R enthält 5 verschiedene Werte: 0,3, 0,5, 0,7, 0,9 und 1,1. Jeder dieser 5 Werte hat 42 Zeilen. (5x42 = 210) Um die Duplikate von "R" entferne ich versuche

set(df.R) 

die zurückgibt:

{0.29999999999999999, 
0.5, 
0.69999999999999996, 
0.89999999999999991, 
0.90000000000000002, 
1.1000000000000001} 

neben Von repräsentieren die 0,3 als 0,29999 etc. Es sind 6 (statt 5) verschiedene Werte für R. Es Nähte, die manchmal als 0,9 0,89999999999999991 interpretiert wird und manchmal als ,90000000000000002 Dies kann (partialy) werden gelöst mit:

set(round(df.R,1)) 

die (mindestens) 5 Werte zurückgibt:

{0.29999999999999999, 
0.5, 
0.69999999999999996, 
0.90000000000000002, 
1.1000000000000001} 

Aber jetzt komme ich zum gefährlichen Teil. Wenn ich will, das Schneiden tun nach den bekannten Werten von R (0,3, 0,5, 0,7, 0,9 und 1,1)

len(df[df.R==0.3]) 

kehrt

42 

und

len(df[df.R==0.9]) 

kehrt

41 

Ein Wert wird von Py gelöscht Thon! (Denken Sie daran, dass es für jedes von 5 Rs 42 Zeilen gibt, die die Gesamtzahl von 210 Zeilen in der Datei angeben). Wie mit diesem Problem umzugehen?

Antwort

4

Überprüfen Sie die Floats nicht auf Gleichheit. Es gibt einige Probleme mit Gleitkommaarithmetik (z. B. here).

für closeness Stattdessen überprüfen (wirklich, wirklich Nähe):

import numpy as np 
len(df[np.isclose(df.R, 0.9)]) 

Normalerweise

, wenn Sie die Serie zu einem Satz nicht konvertieren, Pandas damit umgehen würde. Also, wenn Sie Duplikate löschen möchten, würde ich mit Pandas Methoden vorschlagen:

df.drop_duplicates('R') 
+0

vielen Dank für Ihre schnelle Antwort, aber Pandas ‚drop_duplicates‘ löst nicht das Floating-Point-Problem: ‚df.R.drop_duplicates()‘ ergibt: ‚ 0,3 0,5 0,7 0,9 0,9 1,1 ‘ So habe ich noch zwei‚anders‘0,9 Werte – Mato

+0

@Mato Sind Sie sicher, dass sie das gleiche in der Excel-Datei sind? Können Sie die Datei (oder einen Teil davon) teilen, wenn möglich? – ayhan

+0

In Excel sehen die Daten für R = 0.9 identisch aus, aber ich habe gerade versucht, die Daten schnell in Mathematica zu importieren und das gleiche Problem trat auf (die beiden 0.9-Werte). So scheint es, dass die Probleme in den Daten sind (obwohl die Excel-Datei mit einem Pandas 'to_excel' Befehl erzeugt wurde). Ich werde dort nach dem Problem suchen müssen. – Mato

Verwandte Themen