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

