Python制表仅格式化一个浮点列

Pet*_*e M 4 python formatting tabulate

我正在使用该tabulate模块来打印固定宽度的文件,并且有一列需要进行格式化,小数点左边有 19 位,小数点右边有 2 位。

import pandas as pd

from tabulate import tabulate

df = pd.DataFrame.from_dict({'A':['x','y','z'],
'B':[1,1.1,11.21],'C':[34.2334,81.1,11]})

df
Out[4]: 
   A      B        C
0  x   1.00  34.2334
1  y   1.10  81.1000
2  z  11.21  11.0000

df['C'] = df['C'].apply(lambda x: format(x,'0>22.2f'))

df
Out[6]: 
   A      B                       C
0  x   1.00  0000000000000000034.23
1  y   1.10  0000000000000000081.10
2  z  11.21  0000000000000000011.00

print(tabulate(df))
-  -  -----  -----
0  x   1     34.23
1  y   1.1   81.1
2  z  11.21  11
-  -  -----  -----
Run Code Online (Sandbox Code Playgroud)

有什么方法可以保留 C 列中的格式而不影响 B 列中的格式吗?我知道我可以使用 floatfmt = '0>22.2f' 但我不需要 B 列看起来像 C 列那样。

根据表格文档,看起来像小数的字符串将自动转换为数字。如果我可以抑制这个问题,那么在打印之前格式化我的表格(如上例所示),这也可以为我解决这个问题。

fam*_*zah 7

GitHub 上的文档是最新的,它指出floatfmt每列可能有不同的数字格式”。这是使用您的数据的示例:

import pandas as pd
from tabulate import tabulate

df = pd.DataFrame.from_dict({'A':['x','yy','zzz'],
'B':[1,1.1,11.21],'C':[34.2334,81.1,11]})

print(tabulate(df, floatfmt=(None, None, '.2f', '0>22.2f',)))
Run Code Online (Sandbox Code Playgroud)

结果是:

-  ---  -----  ----------------------
0  x     1.00  0000000000000000034.23
1  yy    1.10  0000000000000000081.10
2  zzz  11.21  0000000000000000011.00
-  ---  -----  ----------------------
Run Code Online (Sandbox Code Playgroud)

此外,正如您所建议的,您还可以选择disable_numparse禁用从字符串到数字的自动转换。然后,您可以手动格式化每个字段,但这需要更多编码。在这种情况下,该选项colalign可能会派上用场,以便您可以为字符串和数字指定不同的列对齐方式(您也可以将其转换为格式化字符串)。