Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Format certain floating dataframe columns into percentage in pandas

I am trying to write a paper in IPython notebook, but encountered some issues with display format. Say I have following dataframe df, is there any way to format var1 and var2 into 2 digit decimals and var3 into percentages.

       var1        var2         var3     id                                               0    1.458315    1.500092   -0.005709    1    1.576704    1.608445   -0.005122     2    1.629253    1.652577   -0.004754     3    1.669331    1.685456   -0.003525    4    1.705139    1.712096   -0.003134    5    1.740447    1.741961   -0.001223    6    1.775980    1.770801   -0.001723     7    1.812037    1.799327   -0.002013     8    1.853130    1.822982   -0.001396     9    1.943985    1.868401    0.005732 

The numbers inside are not multiplied by 100, e.g. -0.0057=-0.57%.

like image 806
user3576212 Avatar asked Jun 01 '14 15:06

user3576212


People also ask

How do I format a column into a percentage in python?

format({'var1': "{:. 2f}",'var2': "{:. 2f}",'var3': "{:. 2%}"}) Thanks!

How do you show percentage in pandas?

You can calculate the percentage of total with the groupby of pandas DataFrame by using DataFrame. groupby() , DataFrame. agg() , DataFrame. transform() methods and DataFrame.


1 Answers

The accepted answer suggests to modify the raw data for presentation purposes, something you generally do not want. Imagine you need to make further analyses with these columns and you need the precision you lost with rounding.

You can modify the formatting of individual columns in data frames, in your case:

output = df.to_string(formatters={     'var1': '{:,.2f}'.format,     'var2': '{:,.2f}'.format,     'var3': '{:,.2%}'.format }) print(output) 

For your information '{:,.2%}'.format(0.214) yields 21.40%, so no need for multiplying by 100.

You don't have a nice HTML table anymore but a text representation. If you need to stay with HTML use the to_html function instead.

from IPython.core.display import display, HTML output = df.to_html(formatters={     'var1': '{:,.2f}'.format,     'var2': '{:,.2f}'.format,     'var3': '{:,.2%}'.format }) display(HTML(output)) 

Update

As of pandas 0.17.1, life got easier and we can get a beautiful html table right away:

df.style.format({     'var1': '{:,.2f}'.format,     'var2': '{:,.2f}'.format,     'var3': '{:,.2%}'.format, }) 
like image 193
linqu Avatar answered Oct 13 '22 04:10

linqu