你可以格式化 pandas 整数以进行显示,例如用于浮点数的 `pd.options.display.float_format` 吗?
Posted
技术标签:
【中文标题】你可以格式化 pandas 整数以进行显示,例如用于浮点数的 `pd.options.display.float_format` 吗?【英文标题】:Can you format pandas integers for display, like `pd.options.display.float_format` for floats? 【发布时间】:2015-06-22 04:23:13 【问题描述】:我已经看到 this 和 this 在格式化 浮点 数字以在 pandas 中显示,但我有兴趣为 整数做同样的事情>。
现在,我有:
pd.options.display.float_format = ':,.2f'.format
这适用于我数据中的浮点数,但要么会在转换为浮点数的整数上留下烦人的尾随零,要么我会得到不使用逗号格式化的纯整数。
pandas 文档提到了一个 SeriesFormatter
类,我找不到任何相关信息。
或者,如果有一种方法可以编写一个字符串格式化程序,它将浮点数格式化为':,.2f'
,并以零尾随小数浮点数作为':,d'
,那也可以。
【问题讨论】:
【参考方案1】:你可以猴子补丁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
【讨论】:
不错的解决方案,有没有办法关闭它? @leonyin:您可以使用上下文管理器。我已经修改了帖子以说明我的意思。 可以通过调用df来维护html格式吗? print(df) 未格式化 @leonyin:print(df.to_html())
在 with-statement
中生成自定义格式的 HTML。
Neat hack,您应该将其提交给 pandas 食谱,并作为对 pd.options.display.int_format
的任何增强请求的评论。我认为这不会在酸洗后存活,值得注意。【参考方案2】:
Jupyter 笔记本的另一个选项是使用 df.style.format(':,')
,但据我所知,它只适用于单个数据帧,因此您每次都必须调用它:
table.style.format(':,')
col1 col2
0s 9,246,452 6,669,310
>0 2,513,002 5,090,144
table
col1 col2
0s 9246452 6669310
>0 2513002 5090144
Styling — pandas 1.1.2 documentation
【讨论】:
当数据框包含str
列时,这似乎不起作用,引发以下错误:ValueError: Cannot specify ',' with 's'.
有没有办法使用样式函数来解决这个问题?
@Farid 你可能有几个选项,文档(上面链接)说.format
可以接受一个函数,所以你可以有一个函数来检查类型,然后格式化不同于数字的字符串.另一种选择是.format
可以采用dict
,其中键指定列,值是不同列的不同格式。【参考方案3】:
从 Pandas 1.3.0 开始,您可以指定 df.style.format(thousands=',')
以使用逗号分隔浮点数、复数和整数中的千位。
请参阅:https://pandas.pydata.org/docs/reference/api/pandas.io.formats.style.Styler.format.html。
【讨论】:
以上是关于你可以格式化 pandas 整数以进行显示,例如用于浮点数的 `pd.options.display.float_format` 吗?的主要内容,如果未能解决你的问题,请参考以下文章