在不更改其他值的情况下从数据框中替换 table 中的 NaN 值

Replace NaN value in table from dataframe without changed other values

我从代码下面使用的数据框创建了数据透视表 table

table = pd.pivot_table(df_table, values=['KPI Amount Convert to USD'], index=['Customer Nick', 'Customer',
                                                                             'Customer Name', 'BSO Name', 'BSO Comment',
                                                                            'Pay Date, Recovery action, No pay schedule reason '],
                       columns=['Range'], aggfunc={'KPI Amount Convert to USD': np.sum}, margins=True,
                       margins_name='Grand Total')

效果很好,但有些值为 NaN(其他为常规数字)

当我使用

table = table.replace(np.nan, '', regex=True)

NaN 值是空的,但一些值被更改为 3.0176e+06,甚至在它之前是 3017601.99。

你知道如何替换 NaN 值,但保留其他的 int 格式吗?

感谢您的建议

你试过了吗 table = table.fillna('')

  table = table.fillna('-')

  table = table.fillna(0)

这是一个格式问题 - 基本上,当列为给定类型时,数字会以特定方式显示。

如果您的列只有浮点数(因此数字和 np.nan 适合),它将以一种方式显示内容。

如果您的列有浮点数和字符串(数字和''),则列 dtype 设置为 "object" 并且它显示各种不同的东西,例如大 floats/ints

这就是 df.fillna(0) 起作用的原因(0 也是一个浮点数,所以 dtype 仍然是浮点数)但是 df.fillna('') 会创建相同的显示更改。

实际值不变,eg:

df.loc[2,0]
> 3017601.990
df.fillna('').loc[2,0] == df.fillna(0).loc[2,0]
> True

这里的问题是列的 dtype(数据类型),或者更准确地说是底层 numpy 数组。我假设在您的 table 数据框中,包含 NaN 值的列具有浮点类型 (float64)。

如果将 NaN 替换为 0.,一切都会好起来的,但是如果您想在那里写入一个空字符串,Pandas 将 dtype 更改为 object

顺便说一句,3.0176e+06 只是 3017601.99 的不同表示,但我认为该值没有改变。 pandas 对 np.float64 类型的列和 object 类型的列使用不同的表示。

您可以通过设置相关选项要求它对 object 列中的浮点值使用默认的 str 转换:pd.set_option('display.float_format', str)

演示:

>>> pd.set_option('display.float_format', None)                # reset option
>>> df = pd.DataFrame([[3017601.99], [np.nan]], columns=['A'])
>>> df
            A
0  3017601.99
1         NaN
>>> df1 = df.fillna('')
>>> df1
            A
0  3.0176e+06
1            
>>> pd.set_option('display.float_format', str)      # set the option
>>> df1
           A
0 3017601.99
1           
>>> df.loc[0,'A'] == df1.loc[0,'A']
True