当前位置: 首页>后端>正文

python 浮点数 float32 python 浮点数转百分比

python-将某些浮动数据框列格式化为熊猫百分比

我正在尝试在IPython笔记本中写论文,但是在显示格式方面遇到了一些问题。 说我有以下数据帧df,有什么办法可以将var1和var2格式化为2位数的小数位数,以及将var3格式化为百分比。

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

里面的数字不乘以100,例如 -0.0057 = -0.57%。

7个解决方案

87 votes

可接受的答案建议出于演示目的修改原始数据,而您通常不希望这样做。 想象一下,您需要对这些列进行进一步分析,并且需要舍入而失去的精度。

在这种情况下,您可以修改数据框中各个列的格式:

output = df.to_string(formatters={

'var1': '{:,.2f}'.format,

'var2': '{:,.2f}'.format,

'var3': '{:,.2%}'.format

})

print(output)

供您参考,to_html会产生21.40%,因此不需要乘以100。

您再也没有一个漂亮的HTML表,而是一个文本表示形式。 如果需要使用HTML,请改用to_html函数。

from IPython.core.display import display, HTML

output = df.to_html(formatters={

'var1': '{:,.2f}'.format,

'var2': '{:,.2f}'.format,

'var3': '{:,.2%}'.format

})

display(HTML(output))

更新资料

从熊猫0.17.1开始,生活变得更加轻松,我们可以立即获得一个漂亮的html表:

df.style.format({

'var1': '{:,.2f}'.format,

'var2': '{:,.2f}'.format,

'var3': '{:,.2%}'.format,

})

linqu answered 2020-01-29T11:17:11Z

32 votes

使用round函数替换值,并格式化百分比数字的字符串表示形式:

df['var2'] = pd.Series([round(val, 2) for val in df['var2']], index = df.index)

df['var3'] = pd.Series(["{0:.2f}%".format(val * 100) for val in df['var3']], index = df.index)

舍入函数将浮点数舍入为该函数的第二个参数提供的小数位数。

字符串格式可让您根据需要表示数字。 您可以通过更改f之前的数字来更改显示的小数位数。

ps。 我不确定您的“百分比”数字是否已乘以100。如果清楚了,您将要更改显示的小数位数,并删除百分位数。

Woody Pride answered 2020-01-29T11:16:28Z

28 votes

您还可以设置float的默认格式:

pd.options.display.float_format = '{:.2f}%'.format

Romain Jouin answered 2020-01-29T11:17:30Z

21 votes

按照@linqu的建议,您不应更改要显示的数据。 自熊猫0.17.1起,(条件)格式化变得更加容易。 引用文档:

您可以使用DataFrame.style属性来应用条件格式,即DataFrame的可视样式,具体取决于其中的数据。 此属性返回pandas.Styler对象,该对象具有用于格式化和显示DataFrames的有用方法。

对于您的示例,将是(通常的表将在Jupyter中显示):

df.style.format({

'var1': '{:,.2f}'.format,

'var2': '{:,.2f}'.format,

'var3': '{:,.2%}'.format,

})

mdeff answered 2020-01-29T11:18:00Z

9 votes

通常,我们有兴趣计算完整的有效数字,但是为了视觉美观,在显示数据框时,我们可能只希望看到小数点。

在jupyter-notebook中,大熊猫可以利用称为style的方法来利用html格式。

对于仅看到某些列的两位有效数字的情况,我们可以使用以下代码段:

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

给出:

var1 var2 var3

id

0 1.46 1.50 -0.57%

1 1.58 1.61 -0.51%

2 1.63 1.65 -0.48%

3 1.67 1.69 -0.35%

4 1.71 1.71 -0.31%

5 1.74 1.74 -0.12%

6 1.78 1.77 -0.17%

7 1.81 1.80 -0.20%

8 1.85 1.82 -0.14%

9 1.94 1.87 0.57%

Poudel answered 2020-01-29T11:18:33Z

6 votes

这是您需要在更大范围的色谱柱上进行操作的另一种方法

使用applymap

df[['var1','var2']] = df[['var1','var2']].applymap("{0:.2f}".format)

df['var3'] = df['var3'].applymap(lambda x: "{0:.2f}%".format(x*100))

如果需要将函数应用于多个列,applymap很有用; 对于此特定示例,它实质上是以下内容的缩写:

df[['var1','var2']].apply(lambda x: map(lambda x:'{:.2f}%'.format(x),x),axis=1)

下面对apply进行详细说明,将applymap映射:

Pandas中map,applymap和apply方法之间的区别

RK1 answered 2020-01-29T11:19:11Z

1 votes

作为一种可以被认为更易读,优雅且通用的解决方案(YMMV),您可以利用pd.options.display.float_format方法:

# OP example

df['var3'].map(lambda n: '{:,.2%}'.format(n))

# also works on a series

series_example.map(lambda n: '{:,.2%}'.format(n))

在性能方面,这与OP解决方案非常接近(略慢)。

顺便说一句,如果您选择选择pd.options.display.float_format路线,请考虑使用上下文管理器来处理此并行numpy示例的状态。

circld answered 2020-01-29T11:19:40Z


https://www.xamrdz.com/backend/3pn1964211.html

相关文章: