Pandas df 中的会计格式

Accounting formatting in Pandas df

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 的东西,但我不精通这些语言所以他们没有真正工作完全没有。

您的输出看起来像是在使用 Jupyter notebook 中的 HTML 显示,因此您需要为 white-space 样式设置 pre,因为 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 以实现会计格式逻辑。