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
相关产品推荐
相关产品推荐

