【问题标题】:Accounting formatting in Pandas dfPandas df中的会计格式
【发布时间】:2018-07-15 06:51:52
【问题描述】:

x=pd.DataFrame([[5.75,7.32],[1000000,-2]])

def money(val):
    """
    Takes a value and returns properly formatted money
    """
    if val < 0:
        return "$({:>,.0f})".format(abs((val)))
    else:
        return "${:>,.0f}".format(abs(val))

x.style.format({0: lambda x: money(x),
                1: lambda x: money(x)
                })

我正在尝试使用 excel 会计格式在 pandas jupyter 显示中格式化货币。如下所示。

上面的代码我是最成功的,但我也尝试了无数的 css 和 html 东西,但我并不精通这些语言,所以它们根本没有用。

【问题讨论】:

  • 请不要将代码发布为图像,这会使人们难以剪切和粘贴以进行复制和测试。
  • 我将代码作为文本发布。我还将它作为图像包含在内,以便显示输出。

标签: python pandas pandas-styles


【解决方案1】:

您的输出看起来像是在 Jupyter 笔记本中使用 HTML 显示,因此您需要将 pre 设置为 white-space 样式,因为 HTML 折叠多个空格,并使用 monospace字体,例如:

styles = {
    'font-family': 'monospace',
    'white-space': 'pre'
}

x_style = x.style.set_properties(**styles)

现在格式化浮点数,用$ 对齐的简单右对齐可能如下所示:

x_style.format('${:>10,.0f}')

这不太对,因为您想将负数转换为 (2),您可以使用嵌套格式执行此操作,将数字格式与对齐方式分开,以便您可以在负数时添加 (),例如:

x_style.format(lambda f: '${:>10}'.format(('({:,.0f})' if f < 0 else '{:,.0f}').format(f)))

注意:这很脆弱,因为它假定10 具有足够的宽度,而 excel 动态地左对齐 $ 到该列中所有值的最大宽度。

另一种方法是扩展string.StringFormatter 以实现会计格式逻辑。

【讨论】:

  • 谢谢!我有点放弃在这里得到答案了!感谢您让空格重复,我已经通过使用 '&nbsp' 使它工作,但这是一个特别不那么笨拙的解决方案!我将完整地写下我所做的并对其进行编辑,但它绝对会使用那篇文章!
猜你喜欢
  • 2018-12-27
  • 2019-08-10
  • 2020-06-02
  • 1970-01-01
  • 2021-12-20
  • 2021-06-25
  • 2022-08-03
  • 1970-01-01
  • 2017-04-04
相关资源
最近更新 更多