从数据框中替换表格中的NaN值而未更改其他值

时间:2020-03-03 08:51:02

标签: python pandas dataframe pivot-table 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值是空的,但是有些值甚至在30176.99之前都更改为3.0176e + 06。

您是否有办法替换NaN值,但保留其他int格式?

感谢您的建议

4 个答案:

答案 0 :(得分:3)

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

如果将NaN替换为0,就可以了,但是如果您想在其中写入一个空字符串,Pandas会将dtype更改为object

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

您可以通过设置相关选项:str

要求它对object列中的浮点值使用默认的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

答案 1 :(得分:0)

您尝试过吗 table = table.fillna('')

答案 2 :(得分:0)

  table = table.fillna('-')

  table = table.fillna(0)

答案 3 :(得分:0)

这是格式问题-基本上,当给定类型的列中的数字以某种方式显示。

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

如果您的列具有浮点数和字符串(数字和”),则列dtype设置为“对象”,并且它以不同的方式显示各种内容,例如大的浮点数/整数

这就是为什么df.fillna(0)可以工作(0也是浮点数,所以dtype保持浮点数),但是df.fillna('')会产生相同的显示更改的原因。

实际值不变,例如:

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