使用pandas.DataFrame.applymap格式化函数无效,求助CSV读取与重排
解决pandas.DataFrame.applymap无效果问题 + 格式化CSV数据
1. 先排查applymap无效的常见原因
- 忘记赋值结果:
applymap返回一个新的DataFrame,不会修改原对象,必须把结果赋值给变量(比如df = df.applymap(your_func)) - 数据类型不是数值型:如果你的列是字符串类型,格式化函数可能无法正确处理,需要先转成数值:
df = df.apply(pd.to_numeric, errors='coerce') - 格式化逻辑有问题:比如函数没有正确返回格式化后的内容,或者判断条件错误
2. 针对你的CSV数据的完整处理流程
先把你提供的内容整理成标准CSV格式(每行一组数据):
10,1.89e-3,1.92e-3,2.14e-3,2.23e-3,2.38e-3,2.43e-3,2.33e-3,2.87e-3 10,1.84,2.01,2.03,1.99,2.11,2.11,2.09,1.95 20,5.28e-4,4.77e-4,5.23e-4,5.62e-4,5.50e-4,5.64e-4,5.46e-4,7.45e-4 20,1.45,2.00,1.89,1.98,2.08,2.12,2.07,2.15 40,1.93e-4,1.19e-4,1.41e-4,1.42e-4,1.30e-4,1.30e-4,1.30e-4,1.68e-4 40,1.17,2.00,1.61,1.88,2.01,2.03,2.01,1.96 80,8.60e-5,2.98e-5,4.61e-5,3.86e-5,3.23e-5,3.18e-5,3.22e-5,4.33e-5 80,1.06,2.00,1.32,1.69,2.00,2.02,2.00,1.94
方法一:用applymap自定义格式化(修改数据内容)
import pandas as pd # 1. 读取CSV,自动解析数值类型 df = pd.read_csv('data.csv', header=None) # 2. 定义格式化规则:小数值保留6位小数,普通数值保留2位 def format_num(x): if isinstance(x, float): if abs(x) < 0.01: return f"{x:.6f}" else: return f"{x:.2f}" # 整数类型直接返回 return x # 3. 应用格式化并赋值(这步是关键!不赋值原DataFrame不会变) df_formatted = df.applymap(format_num) # 查看格式化后的结果 print(df_formatted)
方法二:设置全局显示格式(仅改变显示,不修改数据)
如果你只是想在查看/输出时格式化,不想改变数据本身的数值类型,可以用全局显示选项:
import pandas as pd df = pd.read_csv('data.csv', header=None) # 自定义浮点数显示逻辑:小数值显示6位,普通数值显示2位 pd.options.display.float_format = lambda x: '{:.6f}'.format(x) if abs(x) < 0.01 else '{:.2f}'.format(x) # 直接查看即可,数据还是原始数值类型 print(df)
3. 快速验证applymap是否生效
如果之前用applymap没效果,按这几步排查:
- 确认执行了
df = df.applymap(...),而不是只跑df.applymap(...) - 运行
df.dtypes检查数据类型,要是列是object类型,先转数值:df = df.apply(pd.to_numeric, errors='coerce') - 单独测试格式化函数:比如
format_num(1.89e-3),看是否返回0.001890
内容的提问来源于stack exchange,提问作者tmaric
相关产品推荐
相关产品推荐

