类型错误:传递给 Series.__format__ 的格式字符串不受支持

Ste*_*ara 3 python pandas plotly plotly-dash

我试图在我的仪表卡上添加千位分隔符,但我所有的努力都是徒劳的。发现这个解决方案更准确,但它给了我一个错误

类型错误:传递给系列的格式字符串不受支持。格式

@app.callback(
[Output('sls', 'children'),
Output('wngs', 'children'),
Output('rvne', 'children')],
Input('year', 'value')
)

def card_update(select_year):
dff=df_good.copy()
df_formattedd=dff.groupby(['year'], as_index=False)[['Net Sale', 'Winnings','Revenue']].sum()
df_formattedd[['Net Sale','Winnings','Revenue']]=df_formattedd[['Net Sale','Winnings','Revenue']].apply(lambda x:round(x,2))
df_formattedd[['Net Sale','Winnings','Revenue']]= df_formattedd[['Net Sale','Winnings','Revenue']].apply(lambda x: f'{x:,}')
sales=df_formattedd[df_formattedd['year']==select_year]['Net Sale']
winnings=df_formattedd[df_formattedd['year']==select_year]['Winnings']
revenue=df_formattedd[df_formattedd['year']==select_year]['Revenue']

return sales, winnings, revenue
Run Code Online (Sandbox Code Playgroud)

Bas*_*den 10

重现您的问题的简短抽象示例代码:

import pandas as pd

df = pd.DataFrame(
    {
        "A": [1000000.111, 1000000.222, 1000000.333],
        "B": [2000000.111, 2000000.222, 2000000.333],
        "C": [3000000.111, 3000000.222, 3000000.333],
    }
)

df[["A", "B", "C"]] = df[["A", "B", "C"]].apply(lambda x: round(x, 2))
df[["A", "B", "C"]] = df[["A", "B", "C"]].apply(lambda x: f'{x:,}')
Run Code Online (Sandbox Code Playgroud)

给出:

类型错误:传递给系列的格式字符串不受支持。格式

问题出在您尝试格式化数字的最后一行。

问题是xlambda 函数引用的是 Pandas Series 而不是数字。系列不支持您正在使用的格式化字符串类型:

',' 选项表示使用逗号作为千位分隔符。

https://docs.python.org/3/library/string.html


相反,你可以这样做:

import pandas as pd

df = pd.DataFrame(
    {
        "A": [1000000.111, 1000000.222, 1000000.333],
        "B": [2000000.111, 2000000.222, 2000000.333],
        "C": [3000000.111, 3000000.222, 3000000.333],
    }
)

df[["A", "B", "C"]] = df[["A", "B", "C"]].apply(lambda x: round(x, 2))
df[["A", "B", "C"]] = df[["A", "B", "C"]].apply(
    lambda series: series.apply(lambda value: f"{value:,}")
)
Run Code Online (Sandbox Code Playgroud)

因此,这里嵌套背后的想法apply是:对于 DataFrame 中的每一列,df[["A", "B", "C"]]获取每一行值并将字符串格式化程序应用于它。行值只是浮点数,因此字符串格式化程序能够处理它。

结果

>>> print(df)
              A             B             C
0  1,000,000.11  2,000,000.11  3,000,000.11
1  1,000,000.22  2,000,000.22  3,000,000.22
2  1,000,000.33  2,000,000.33  3,000,000.33
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用以下方式设置格式pd.options.display.float_format

pd.options.display.float_format = "{:,}".format
Run Code Online (Sandbox Code Playgroud)

请记住,这不仅仅适用于df[["A", "B", "C"]].