Python制表格式仅一个浮点列

时间:2019-01-23 15:00:48

标签: 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
-  -  -----  -----

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

根据列表documentation,看起来像小数的字符串将自动转换为数字。如果我可以抑制这种情况,则可以在打印之前格式化表格(如上例所示),同样也可以解决该问题。

2 个答案:

答案 0 :(得分:1)

您是否绝对需要将其制成表格?您可以使用以下方法达到类似的效果(短划线):

In [18]: print(df.__repr__().split('\n',1)[1])                                                                                                
0  x   1.00  0000000000000000034.23
1  y   1.10  0000000000000000081.10
2  z  11.21  0000000000000000011.00

df.__repr__df的表示形式,即在单元格中键入df时看到的内容。然后,我通过在第一个新行char上进行拆分并进行拆分的另一半来删除标题行。

此外,如果将其写成机器可读的形式,则可能需要使用标签:

In [8]: df.to_csv(sys.stdout, sep='\t', header=False)                                                                                         
0   x   1.0 0000000000000000034.23
1   y   1.1 0000000000000000081.10
2   z   11.21   0000000000000000011.00

它会根据选项卡的渲染设置进行漂亮的渲染,但是如果在文件中输出,则会得到选项卡符号

答案 1 :(得分:1)

GitHub上的documentation是最新的,它指出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',)))

结果是:

-  ---  -----  ----------------------
0  x     1.00  0000000000000000034.23
1  yy    1.10  0000000000000000081.10
2  zzz  11.21  0000000000000000011.00
-  ---  -----  ----------------------

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