2014-04-10 10 views
5

Sto scrivendo un pda df su un csv. Quando lo scrivo in un file CSV, alcuni degli elementi in una delle colonne vengono convertiti in modo errato in notazioni/numeri scientifici. Ad esempio, col_1 contiene stringhe come "104D59". Le stringhe sono per lo più rappresentate come stringhe nel file CSV, come dovrebbero essere. Tuttavia, stringhe occasionali, come "104E59", vengono convertite in notazione scientifica (ad es. 1.04 E 61) e rappresentate come numeri interi nel file csv che ne deriva.pandas to_csv: sopprime la notazione scientifica nel file csv quando si scrivono panda su csv

Sto tentando di esportare il file csv in un pacchetto software (ad esempio, panda -> csv -> software_new) e questa modifica nel tipo di dati sta causando problemi con tale esportazione.

C'è un modo per scrivere il file df in un csv, assicurando che tutti gli elementi in df ['problem_col'] siano rappresentati come stringa nel risultante csv o non convertiti in notazione scientifica?

Ecco il codice che ho usato per scrivere il panda df ad un csv: df.to_csv ('df.csv', encoding = 'utf-8')

posso controllare anche la dtype della colonna problema: per df.dtype, df [ 'problem_column'] è un oggetto

risposta

6

utilizzare l'argomento float_format:

In [11]: df = pd.DataFrame(np.random.randn(3, 3) * 10 ** 12) 

In [12]: df 
Out[12]: 
       0    1    2 
0 1.757189e+12 -1.083016e+12 5.812695e+11 
1 7.889034e+11 5.984651e+11 2.138096e+11 
2 -8.291878e+11 1.034696e+12 8.640301e+08 

In [13]: print(df.to_string(float_format='{:f}'.format)) 
        0      1     2 
0 1757188536437.788086 -1083016404775.687134 581269533538.170288 
1 788903446803.216797 598465111695.240601 213809584103.112457 
2 -829187757358.493286 1034695767987.889160 864030095.691202 

che funziona allo stesso modo per to_csv:

df.to_csv('df.csv', float_format='{:f}'.format, encoding='utf-8') 
+1

non sembra funziona come da panda 0.17.1: TypeError: tipo/i di operando non supportati per%: 'builtin_function_or_method' e 'float' – sammosummo

+0

@ user1637894 funziona ancora per me con 0.17.1: s. Testato su Python 2.7 e 3.4 con alcune versioni numpy diverse. –

+0

@ user1637894 Raccomando di pubblicare il tuo problema sul github dei panda! –

0

Se si desidera utilizzare i valori come stringa formattata in un elenco, dicono come parte di csv.writier csvfile, i numeri possono essere formattati prima di creare un elenco:

with open('results_actout_file','w',newline='') as csvfile: 
    resultwriter = csv.writer(csvfile, delimiter=',') 
    resultwriter.writerow(header_row_list) 

    resultwriter.writerow(df['label'].apply(lambda x: '%.17f' % x).values.tolist())