2013-08-07 11 views
9

Quando si scrive per csv di prima di utilizzare Pandas, mi capitava spesso di utilizzare il seguente formato per le percentuali:scrittura Percentuali in Excel Uso Pandas

'%0.2f%%' % (x * 100) 

Questo verrà elaborato da Excel in modo corretto durante il caricamento del csv.

Ora, io sto cercando di utilizzare la funzione to_excel Panda e utilizzando

(simulated * 100.).to_excel(writer, 'Simulated', float_format='%0.2f%%') 

e ottenere un "ValueError: valida letterale float(): 0,0126%". Senza '%%' scrive bene ma non è formattato come percentuale.

C'è un modo per scrivere le percentuali in to_excel di panda?

+1

Penso che sia un "bug". Aprendo un problema su http: //www.github.com/pydata/pandas ... –

+0

FYI, non riesco nemmeno a ottenere il formato con pandas-0.12.0 – fred

+0

Grazie per dare un'occhiata. Sembra che dovrò aspettare alcune versioni. – rhaskett

risposta

7

Si può fare la seguente soluzione alternativa al fine di raggiungere questo obiettivo:

df *= 100 
df = pandas.DataFrame(df, dtype=str) 
df += '%' 

ew = pandas.ExcelWriter('test.xlsx') 
df.to_excel(ew) 
ew.save() 
+1

Funziona. Grazie. – rhaskett

+1

Questa soluzione produce stringhe nelle celle del foglio di Excel? Questo è piuttosto uno svantaggio ... non è vero? – Dror

+1

@Dror punto buono ... Ho provato e il foglio Excel risultante ha numeri, non stringhe –

2

Questa è la soluzione sono arrivato a utilizzare panda con OpenPyXL v2.2, e garantendo le cellule contengono i numeri alla fine, e non le stringhe . Mantenere i valori come galleggianti, applicare formato alla cella finale da cellule (attenzione: non efficiente):

xlsx = pd.ExcelWriter(output_path) 
df.to_excel(xlsx, "Sheet 1") 
sheet = xlsx.book.worksheets[0] 
for col in sheet.columns[1:sheet.max_column]: 
    for cell in col[1:sheet.max_row]: 
     cell.number_format = '0.00%' 
     cell.value /= 100 #if your data is already in percentages, has to be fractions 
xlsx.save() 

Vedere OpenPyXL documentation per più formati numerici.

In modo abbastanza interessante, i documenti suggeriscono che OpenPyXL è abbastanza intelligente da indovinare le percentuali da una stringa formattata come "1,23%", ma ciò non accade per me. Ho trovato il codice in _Prepyxl1Writer di Pandas che utilizza "set_value_explicit" sulle stringhe, ma nulla del genere per le altre versioni. Vale la pena di ulteriori indagini se qualcuno vuole arrivare a fondo di questo.

Problemi correlati