You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas数值格式化两位小数失效问题求助

问题:Excel“Total Cost”列格式化后无法保留两位小数的排查与解决

我需要将Excel中“Total Cost”列的货币数据取绝对值后,格式化为保留两位小数的字符串(如0.5需显示为0.50),以便匹配其他数据集后导入PowerBI。但执行以下代码后,0.5仍显示为0.5,请问问题出在哪里?

def extract_data(filename, sheet_name):
    # DataFrame containing data extracted from Excel sheet
    df = pd.read_excel(filename, sheet_name=sheet_name, skiprows=[0])

    # Drop rows and columns with all NaN values
    df.dropna(how='all', axis=0, inplace=True)
    df.dropna(how='all', axis=1, inplace=True)

    # Format columns based on their data types
    for col in df.columns:
        if df[col].dtype == 'object': #Handle text or categorical data
            df[col] = df[col].astype(str).str.strip() #Remove leading/trailing whitespace
        elif df[col].dtype == 'float64': #Format numeric data
           
            # Format specific columns based on required use case
            if col == "Total Cost": #Selecting column based on header value
                df[col] = df[col].apply(lambda x: '{:.2f}'.format(abs(x)) if pd.notnull(x) else "")         

问题原因

你写的格式化逻辑本身没问题,但Pandas的自动类型推断机制会干扰结果:当你把格式化后的字符串(比如"0.50")赋值给原本是float64类型的列时,Pandas会自动把这些字符串转回float类型,导致末尾的0被省略,最终显示为0.5。

你可以在代码末尾加一行print(df["Total Cost"].dtype)验证,结果大概率是float64而不是object(字符串类型),说明格式后的字符串被自动转换了。

解决方案

方案1:强制保留字符串类型(匹配其他数据集需求)

修改代码,在生成格式化字符串后,强制将列类型转为字符串,避免Pandas自动转换:

elif df[col].dtype == 'float64': #Format numeric data
    # Format specific columns based on required use case
    if col == "Total Cost": #Selecting column based on header value
        # 生成格式化字符串后,强制转换为str类型锁定格式
        df[col] = df[col].apply(lambda x: '{:.2f}'.format(abs(x)) if pd.notnull(x) else "").astype(str)

方案2:保留数值类型,通过显示设置控制格式(适合PowerBI导入)

如果不需要字符串格式,只是希望在PowerBI中显示两位小数,可以保留数值类型,直接对数据取绝对值并保留两位小数,后续在PowerBI中设置列格式即可:

elif df[col].dtype == 'float64': #Format numeric data
    # Format specific columns based on required use case
    if col == "Total Cost": #Selecting column based on header value
        # 取绝对值后保留两位小数,数据仍为数值类型
        df[col] = df[col].abs().round(2)

这种方式更适合PowerBI的数值分析需求,后续在PowerBI中只需将该列设置为货币格式并保留两位小数即可。

内容的提问来源于stack exchange,提问作者Dxrkpine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:13:10