问题描述
我见过 这个 和 this 关于格式化 floating-point 数字以在 pandas 中显示,但我有兴趣为 整数 做同样的事情.
I've seen this and this on formatting floating-point numbers for display in pandas, but I'm interested in doing the same thing for integers.
现在,我有:
pd.options.display.float_format = '{:,.2f}'.format
这适用于我数据中的浮点数,但要么会在转换为浮点数的整数上留下烦人的尾随零,要么我会得到不使用逗号格式化的纯整数.
That works on the floats in my data, but will either leave annoying trailing zeroes on integers that are cast to floats, or I'll have plain integers that don't get formatted with commas.
pandas 文档提到了一个 SeriesFormatter 类,我无法找到任何相关信息.
The pandas docs mention a SeriesFormatter class about which I haven't been able to find any information.
或者,如果有一种方法可以编写一个字符串格式化程序,它将浮点数格式化为 '{:,.2f}' 并以零尾随十进制浮点数作为 '{:,d}',那也行.
Alternatively, if there's a way to write a single string formatter that will format floats as '{:,.2f}' and floats with zero trailing decimal as '{:,d}', that'd work too.
推荐答案
你可以猴子补丁 pandas.io.formats.format.IntArrayFormatter:
import contextlib import numpy as np import pandas as pd import pandas.io.formats.format as pf np.random.seed(2015) @contextlib.contextmanager def custom_formatting(): orig_float_format = pd.options.display.float_format orig_int_format = pf.IntArrayFormatter pd.options.display.float_format = '{:0,.2f}'.format class IntArrayFormatter(pf.GenericArrayFormatter): def _format_strings(self): formatter = self.formatter or '{:,d}'.format fmt_values = [formatter(x) for x in self.values] return fmt_values pf.IntArrayFormatter = IntArrayFormatter yield pd.options.display.float_format = orig_float_format pf.IntArrayFormatter = orig_int_format df = pd.DataFrame(np.random.randint(10000, size=(5,3)), columns=list('ABC')) df['D'] = np.random.random(df.shape[0])*10000 with custom_formatting(): print(df)
产量
A B C D 0 2,658 2,828 4,540 8,961.77 1 9,506 2,734 9,805 2,221.86 2 3,765 4,152 4,583 2,011.82 3 5,244 5,395 7,485 8,656.08 4 9,107 6,033 5,998 2,942.53
在with-statement之外:
print(df)
产量
A B C D 0 2658 2828 4540 8961.765260 1 9506 2734 9805 2221.864779 2 3765 4152 4583 2011.823701 3 5244 5395 7485 8656.075610 4 9107 6033 5998 2942.530551