如何在含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
相关产品推荐
相关产品推荐

