首页 > 解决方案 > 从数据框中替换表中的 NaN 值而不更改其他值

问题描述

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

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 格式吗?

谢谢你的建议

标签: pythonpandasdataframepivot-tablenan

解决方案


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

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

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

您可以通过设置相关选项要求它对列中的str浮点值使用默认转换:objectpd.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

推荐阅读