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

如何在含NaN的指定列中格式化Python Pandas数据框小数位数

问题描述

我通过以下代码从CSV文件加载Pandas数据框:

df_c = pd.read_csv(os.path.join(dir_w, csv_c))

得到的数据框如下:

SubCase        Row1   Row2    Row3   Row4
0  1003001          NaN     0     NaN   10.0
1  1003002          NaN     0     NaN   10.5
2  1003003          NaN     0     NaN   11.3
3  2000001     110001.0    10     1.0   9.81
4  2000002     110001.0    10     1.0   5.06

我希望将Row1、Row2、Row3列的小数位去除,同时保留Row4列的小数位,使其呈现如下效果:

SubCase        Row1   Row2    Row3   Row4
0  1003001          NaN     0     NaN   10.0
1  1003002          NaN     0     NaN   10.5
2  1003003          NaN     0     NaN   11.3
3  2000001       110001    10       1   9.81
4  2000002       110001    10       1   5.06

尝试了以下代码但未成功:

na_mask = df_c['Row1'].notnull()
df_c.loc[na_mask, 'Row1'] = df_c.loc[na_mask, 'Row1'].round(decimals=0)

以及:

na_mask = df_c['Row1'].notnull()
df_c.loc[na_mask, 'Row1'] = df_c.loc[na_mask, 'Row1'].astype(int)
解决方法

问题根源

你用astype(int)失败是因为普通整数类型无法存储NaN,而你的列里存在缺失值,导致转换报错;round(0)只是把数值取整,但数据类型还是浮点数,所以显示时依然带.0。

方案1:修改数据类型(推荐)

用Pandas的可空整数类型(Int64,大写I),它兼容NaN和整数,转换后列会以整数形式显示:

# 批量处理目标列
cols_to_convert = ['Row1', 'Row2', 'Row3']
df_c[cols_to_convert] = df_c[cols_to_convert].astype('Int64')

执行后数据框就会达到你想要的效果,Row4保持原浮点类型不变。

方案2:仅调整显示格式(不改动数据类型)

如果不想修改数据类型,只是要展示时去掉小数位,可以用style.format设置显示规则:

import pandas as pd

# 配置各列的显示格式
styled_df = df_c.style.format({
    'Row1': lambda x: '{:.0f}'.format(x) if pd.notnull(x) else x,
    'Row2': lambda x: '{:.0f}'.format(x) if pd.notnull(x) else x,
    'Row3': lambda x: '{:.0f}'.format(x) if pd.notnull(x) else x,
    'Row4': '{:.2f}'.format
})
# 展示样式化后的表格
display(styled_df)

这种方法只是改变显示效果,数据框实际类型还是浮点数,适合仅需可视化展示的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:15:22