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

如何在Pandas格式化数据时排除NaN值,保留其原始显示

Pandas格式化DataFrame时保留NaN原显示

问题背景

我有一个包含NaN值的DataFrame,示例代码如下:

import numpy as np
import pandas as pd

data = {'a': [0.3, 0.42, 0.33],
        'b': [0.24, 0.2, np.nan],
        'c': [0.66, 0.29, 0.7]}
index=['row1','row2','row3']
df = pd.DataFrame(data, index=index)

因部分场景需逐行应用差异化格式,当前格式化代码如下:

df.loc['row1'] = df.loc['row1'].apply('{:.2%}'.format)
df.loc['row2'] = df.loc['row2'].apply('{:.2%}'.format)
df.loc['row3'] = df.loc['row3'].apply('{:.2%}'.format)

格式化后NaN值被错误添加%符号,输出结果:

a       b       c
row1    30.00%  24.00%  66.00%
row2    42.00%  20.00%  29.00%
row3    33.00%  nan%    70.00%

需要实现:格式化时跳过NaN,保留其原有的'nan'显示。

解决方案

方法1:自定义格式化函数(推荐)

编写自定义函数判断值是否为NaN,仅对非NaN值执行百分比格式化:

def format_percent(x):
    return '{:.2%}'.format(x) if not pd.isna(x) else x

# 逐行应用自定义函数
df.loc['row1'] = df.loc['row1'].apply(format_percent)
df.loc['row2'] = df.loc['row2'].apply(format_percent)
df.loc['row3'] = df.loc['row3'].apply(format_percent)

执行后,NaN会保持原显示状态,不会被追加%符号。

方法2:分步骤处理非NaN值

先对每行的非NaN值做格式化,再合并回原行保留NaN:

# 以row3为例,可根据需求调整格式化规则
row = df.loc['row3']
formatted_non_nan = row.dropna().apply('{:.2%}'.format)
df.loc['row3'] = formatted_non_nan.combine_first(row)

该方法适合差异化场景,比如不同行用不同精度的百分比:

# row1使用1位小数百分比
row1 = df.loc['row1']
df.loc['row1'] = row1.dropna().apply('{:.1%}'.format).combine_first(row1)

# row3使用2位小数百分比
row3 = df.loc['row3']
df.loc['row3'] = row3.dropna().apply('{:.2%}'.format).combine_first(row3)

方法3:使用Styler仅调整显示效果(不修改数据)

如果仅需在可视化输出(如Jupyter Notebook)中保留NaN样式,无需修改DataFrame数据类型,可使用Pandas Styler:

def format_display(val):
    if pd.isna(val):
        return ''  # 或直接返回val,显示时会保留原NaN样式
    return '{:.2%}'.format(val)

# 应用样式后仅改变显示,原数据不受影响
df.style.applymap(format_display)

内容的提问来源于stack exchange,提问作者DISC-O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:25:20