问题描述
我有多列,有些我想用科学计数法,另一些要达到特定的十进制精度水平:
Frequency n
0 0.0023 2.3
1 0.0420 4.5
2 0.5460 6.7
3 0.1230 8.9
频率可以有一个小的数量级,所以我最终得到十亿个零。 “ n”列应设置为固定的小数位数。
我尝试在“频率”列上执行以下操作:
fntables['Frequency'].options.display.float_format = '{:.2e}'.format
这将返回预期的错误,因为“系列”对象没有属性“选项”,因为选项位于熊猫级实例上。
解决方法
样本数据
import pandas as pd
import numpy as np
# sample data
np.random.seed(10)
df = pd.DataFrame(np.random.random(5)**10,columns=['A'])
# display(df)
A
0 7.453316e-02
1 1.481116e-17
2 1.043476e-02
3 5.542183e-02
4 9.477913e-04
设置precision
:全局设置
- 浮点输出精度,以小数点后的位数表示,适用于常规格式以及科学计数法。类似于numpy的精确打印选项
-
pd.reset_option('precision')
重置设置。
pd.set_option('precision',3)
# display(df)
A
0 7.453e-02
1 1.481e-17
2 1.043e-02
3 5.542e-02
4 9.478e-04
print(df.iloc[0,0])
[out]:
0.07453316227023182
设置float_format
:全局设置
- 可调用对象应接受浮点数,并以所需的数字格式返回字符串。这在SeriesFormatter等某些地方使用。有关示例,请参见core.format.EngFormatter。
-
pd.reset_option('float_format')
重置设置。
pd.options.display.float_format = '{:.3e}'.format
# display(df)
A
0 7.453e-02
1 1.481e-17
2 1.043e-02
3 5.542e-02
4 9.478e-04
print(df.iloc[0,0])
[out]:
0.07453316227023182
apply
或map
:str
格式
df['format'] = df.A.apply(lambda x: f'{x:0.3e}')
df['format'] = df.A.apply('{:,.3e}'.format)
df['format'] = df.A.map('{:,.3e}'.format)
# display(df)
A format
0 7.453316e-02 7.453e-02
1 1.481116e-17 1.481e-17
2 1.043476e-02 1.043e-02
3 5.542183e-02 5.542e-02
4 9.477913e-04 9.478e-04
np.format_float_scientific
:str
格式
df['numpy_format'] = df.A.map(lambda x: np.format_float_scientific(x,precision = 3))
# display(df)
A numpy_format
0 7.453316e-02 7.453e-02
1 1.481116e-17 1.481e-17
2 1.043476e-02 1.043e-02
3 5.542183e-02 5.542e-02
4 9.477913e-04 9.478e-04
,
最终通过np.format_float_scientific方法使用列表理解
fntables['A_sci'] = [np.format_float_scientific(x,precision = 3) for x in fntables['A']]