在不更改其他值的情况下从数据框中替换 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
我从代码下面使用的数据框创建了数据透视表 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