使用pd.DataFrame.style.apply()为DataFrame设置不同数字格式报错解决
问题:为DataFrame不同元素应用不同数字格式触发TypeError
你的代码如下:
import pandas as pd # Define formatting functions def float1(x): return "{:.1f}".format(x) def float2(x): return "{:.2f}".format(x) def float3(x): return "{:.3f}".format(x) # Sample dataframe df = pd.DataFrame({ 'A': [10.123, 20.345, 30.567], 'B': [40.789, 50.901, 60.123], 'C': [float1, float2, float3], 'D': ['string1', 'string2', 'string3'] }) format_dict = df['C'].to_dict() # Apply formatting functions based on values in column C df_styled = df.style.apply(lambda x: format_dict[x.name](x), axis=1, subset=['A', 'B']) # Apply formatting rule to column D df_styled = df_styled.format({'D': '{}'}) # Display the styled dataframe display(df_styled)
运行后触发错误:
TypeError: unsupported format string passed to Series.format
错误原因
lambda x: format_dict[x.name](x)中的x是每行A、B列组成的Series对象,但你定义的float1/float2/float3只能处理单个数值。将Series直接传入"{:.1f}".format()会触发类型错误,因为Python无法直接格式化Series类型。
解决方法
修改样式应用逻辑,针对每一行的单个数值调用对应行C列的格式化函数,以下是两种可行的修正方案:
方案一:逐行遍历处理
import pandas as pd # 定义格式化函数 def float1(x): return "{:.1f}".format(x) def float2(x): return "{:.2f}".format(x) def float3(x): return "{:.3f}".format(x) # 示例DataFrame df = pd.DataFrame({ 'A': [10.123, 20.345, 30.567], 'B': [40.789, 50.901, 60.123], 'C': [float1, float2, float3], 'D': ['string1', 'string2', 'string3'] }) # 针对A、B列,逐行应用对应C列的格式化函数 df_styled = df.style.apply( lambda row: [row['C'](row['A']), row['C'](row['B'])], axis=1, subset=['A', 'B'] ) # D列保持原格式 df_styled = df_styled.format({'D': '{}'}) # 显示样式化后的DataFrame display(df_styled)
方案二:按单元格位置匹配函数
import pandas as pd # 定义格式化函数 def float1(x): return "{:.1f}".format(x) def float2(x): return "{:.2f}".format(x) def float3(x): return "{:.3f}".format(x) # 示例DataFrame df = pd.DataFrame({ 'A': [10.123, 20.345, 30.567], 'B': [40.789, 50.901, 60.123], 'C': [float1, float2, float3], 'D': ['string1', 'string2', 'string3'] }) # 按单元格位置匹配对应行的格式化函数 df_styled = df.style.applymap( lambda val, row_idx: df.loc[row_idx, 'C'](val), subset=['A', 'B'], row_idx=df.index ) # D列保持原格式 df_styled = df_styled.format({'D': '{}'}) # 显示样式化后的DataFrame display(df_styled)
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

