2015-07-29 15 views
9

Sto importando un file csv simile a quello qui sotto. Utilizzo di pandas.read_csvConverti virgole in punti in un Dataframe

df = pd.read_csv(Input, delimiter=";") 

. . .

10; 2015/02/01 16: 58; 2015/02/01 16: 58; -0.59; 0,1; -4,39; notApplicable; 0,79; 0,2

11; 2015/02/01 16: 58; 16 2015/02/01 : 58; -0.57; 0.2; -2.87; NotApplicable; 0.79; 0.21

. . .

Il problema è che quando più avanti nel mio codice provo a usare questi valori ottengo questo errore: TypeError: impossibile moltiplicare la sequenza per non-int di tipo 'float'.

Viene visualizzato questo errore perché il numero che cerco di utilizzare non è scritto con un punto (.) Come separatore decimale ma una virgola (,). Dopo aver modificato manualmente le virgole in punti, il mio programma funziona.

Non riesco a modificare il formato del mio input, e quindi devo sostituire le virgole nel mio DataFrame per far funzionare il mio codice, e voglio che python lo faccia senza la necessità di farlo manualmente. Hai qualche suggerimento?

+1

Hai provato 'df = pd.read_csv (" data.csv ", decimal =", ", delimiter ="; ")' –

+0

No, non l'ho provato, abbastanza nuovo per Python. Mi piace provarlo :) – Nautilius

+0

Spiacente, non capisco che il tuo csv sia formattato usando i punti decimali quindi dovrebbe entrare come float, puoi mostrare al tuo codice che non piace il float dtype, puoi cambiare il dtype usando 'astype (int)' sulla colonna – EdChum

risposta

20

pandas.read_csv ha un parametro decimal per questo: doc

Vale a dire cerco con:

df = pd.read_csv(Input, delimiter=";", decimal=",") 
+0

Ty, ha fatto il trucco. – Nautilius

2

Penso che la risposta citato in precedenza di includere decimal="," in panda read_csv è l'opzione preferita.

Tuttavia, ho trovato che è incompatibile con il motore di analisi Python. per esempio. quando si utilizza skiprow=, read_csv ricadrà su questo motore e quindi non è possibile utilizzare skiprow= e decimal= nella stessa istruzione read_csv per quanto ne so. Inoltre, non sono stato in grado di ottenere in realtà la dichiarazione decimal= al lavoro (probabilmente a causa di me però)

Il giro lungo cammino che ho usato per ottenere lo stesso risultato è con list comprehension, .replace e .astype. Il principale svantaggio di questo metodo è che esso deve essere fatto una colonna alla volta:

df = pd.DataFrame({'a': ['120,00', '42,00', '18,00', '23,00'], 
       'b': ['51,23', '18,45', '28,90', '133,00']}) 

df['a'] = [x.replace(',', '.') for x in df['a']] 

df['a'] = df['a'].astype(float) 

Ora, colonna avrà un cellule di tipo flottante. La colonna b contiene ancora stringhe.

Si noti che lo .replace utilizzato qui non è una versione integrata di Python ma piuttosto di Python. La versione di Pandas richiede che la stringa sia una corrispondenza esatta o un'espressione regolare.

1

Ho risposto alla domanda su come modificare il decimale comma nel decimale dot con i panda di Python.

$ cat test.py 
import pandas as pd 
df = pd.read_csv("test.csv", quotechar='"', decimal=",") 
df.to_csv("test2.csv", sep=',', encoding='utf-8', quotechar='"', decimal='.') 

dove si specifica la lettura nel separatore decimale come virgola mentre il separatore di uscita è specificato come punto.Quindi

$ cat test.csv 
header,header2 
1,"2,1" 
3,"4,0" 
$ cat test2.csv 
,header,header2 
0,1,2.1 
1,3,4.0 

dove si vede che il separatore è cambiato in punto.

Problemi correlati