我从下面的代码使用的数据框中创建了数据透视表
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格式?
感谢您的建议
答案 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