Python 制表格式只有一个浮点列
Python Tabulate format only one float column
我正在使用 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 看起来像小数的字符串将自动转换为数字。如果我可以抑制它,那么在打印之前格式化我的 table(如上例所示),这也会为我解决它。
你绝对需要为此制作表格吗?您可以通过以下方式实现类似的效果(条形破折号):
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
时看到的内容。然后,我通过拆分第一个新行字符并采用拆分的另一半来删除 header 行。
此外,如果您将其写入机器可读的格式,您可能需要使用制表符:
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
根据选项卡渲染设置,它会呈现出漂亮的效果,但如果您在文件中输出,则会得到制表符
GitHub 的 documentation 是最新的,它声明 floatfmt
"every column may have different number formatting"。以下是使用您的数据的示例:
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
可能会派上用场,因此您可以为字符串和数字指定不同的列对齐方式(您也可以将其转换为格式化字符串)。
我正在使用 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 看起来像小数的字符串将自动转换为数字。如果我可以抑制它,那么在打印之前格式化我的 table(如上例所示),这也会为我解决它。
你绝对需要为此制作表格吗?您可以通过以下方式实现类似的效果(条形破折号):
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
时看到的内容。然后,我通过拆分第一个新行字符并采用拆分的另一半来删除 header 行。
此外,如果您将其写入机器可读的格式,您可能需要使用制表符:
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
根据选项卡渲染设置,它会呈现出漂亮的效果,但如果您在文件中输出,则会得到制表符
GitHub 的 documentation 是最新的,它声明 floatfmt
"every column may have different number formatting"。以下是使用您的数据的示例:
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
可能会派上用场,因此您可以为字符串和数字指定不同的列对齐方式(您也可以将其转换为格式化字符串)。