Python e l'importzione di numbers a virgola mobile dal file excel

Quindi ho un file Excel che sembra questo

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 

Utilizzando il module pandas, i dati vengono importti in un frame dati

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

Tutto sembra essere ok:

 df 

nella row di command produce:

  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] R s l2 max_amplitude ref_amplitude  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] 0 0,3 0,5 0,1 1,451314 1,451314  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] 1 0.3 0.5 0.6 3.521457 3.521457  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] 2 0.3 0.5 1.1 4.770226 4.770226  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] 207 1.1 2.0 2.1 5.788204 5.788204  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] 208 1.1 2.0 2.6 5.844890 5.844890  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] 209 1.1 2.0 3.1 6.353875 6.353875  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] 

Ora devo fare alcuni calcoli basati sul valore di R, quindi devo fare la taglio dell'arrays. La colonna R contiene 5 valori diversi: 0,3, 0,5, 0,7, 0,9 e 1,1. Ognuno di questi 5 valori ha 42 righe. (5×42 = 210) Per rimuovere i duplicati da "R", provo

 set(df.R) 

che restituisce:

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

Oltre a rappresentare il 0.3 come 0.29999 ecc. Ci sono 6 (invece di 5) diversi valori per R. Si cucita che a volte 0,9 viene interpretato come 0.89999999999999991 e talvolta come 0.90000000000000002 Questo può essere (parzialmente) risolto con:

 set(round(df.R,1)) 

che (alless) restituisce 5 valori:

 {0.29999999999999999, 0.5, 0.69999999999999996, 0.90000000000000002, 1.1000000000000001} 

Ma ora vengo alla parte pericolosa. Se voglio fare il taglio secondo i valori noti di R (0.3, 0.5, 0.7, 0.9 e 1.1)

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

ritorna

 42 

e

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

ritorna

 41 

Un valore viene eliminato da Python! (ricordi, ci sono 42 righe per ognuna delle 5 R che danno il numero totale di 210 righe nel file). Come affrontare questo problema?

Non controllare i galleggianti per uguaglianza. Ci sono alcuni problemi con aritmetica a virgola mobile (per esempio, qui ).

Invece, controllare la vicinanza (veramente vicinanza):

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

Normalmente, se non si converte la serie in un set, i panda gestiranno. Quindi, se vuoi eliminare i duplicati, ti suggerisco di utilizzare i methods pandas:

 df.drop_duplicates('R')